home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / CRS / crs49.d81 / hack9a.sfx / issue9a
Text File  |  1990-02-12  |  108KB  |  3,008 lines

  1.                    ########
  2.              ##################
  3.          ######            ######
  4.       #####
  5.     #####  ####  ####      ##      #####   ####  ####  ####  ####  ####   #####
  6.   #####    ##    ##      ####    ##   ##   ##  ###     ##    ####  ##   ##   ##
  7.  #####    ########     ##  ##   ##        #####       ##    ## ## ##   ##
  8. #####    ##    ##    ########  ##   ##   ##  ###     ##    ##  ####   ##   ##
  9. #####  ####  ####  ####  ####  #####   ####  ####  ####  ####  ####   ######
  10. #####                                                                     ##
  11.  ######            ######           ╔SSUE #9
  12.    ##################            ╩AN. 24, 1995
  13.        ########
  14.  
  15. ---------------------------------------------------------------------(V1.1)---
  16. ┼DITOR'S ╬OTES
  17. BY ├RAIG ╘AYLOR
  18.  
  19. ┴ND *DRUM BEAT PLEASE* HERE'S ANOTHER ISSUE OF ├OMMODORE ╚ACKING!! ╫E'VE
  20. LASTED LONGER AND HAD MORE ISSUES PUT OUT THAN SOME OTHER MAGAZINES ╔ WON'T
  21. DISCUSS (*WONDERING WHERE ISSUE 39 OF THAT MAG IS*).
  22.  
  23. ╬OT MANY ├OMMODORE NOTES THIS TIME - THINGS HAVE GOTTEN A LITTLE BIT MORE
  24. MONTATENOUS(SP - IT'S LATE) ON THE ├OMMODORE FRONT.
  25.  
  26. ╔ WAS UNABLE TO GET AN ARTICLE BY ├RAIG ┬RUCE IN TIME BUT ╔ GOT THE NEXT
  27. BEST THING: ┴N INTERVIEW WITH HIM!! ╒SERS OF HIS SOFTWARE MAY FIND THIS
  28. INTERVIEW INTERESTING IN HOW HE LOOKS AT PROGRAMMING.
  29.  
  30. ╥IGHT NOW ╔'M ENTERTAINING THE THOUGHT OF DROPPING ├= ╚ACKING AFTER ╔
  31. GRADUATE WHICH WILL BE SOMETIME AROUND ╩ULY 1ST OF THIS YEAR. ╔'M INTERESTED
  32. IN SOMEBODY WHO WOULD "CARRY THE REIGN" SO TO SPEAK, AND TAKE OVER MY JOB OF
  33. NAGGING, BUGGING PEOPLE ETC :-) TO WRITE ARTICLES. ╔'VE GOT MY SYSTEM FAIRLY
  34. AUTOMATED IN HANDLING REQUESTS HERE - IF THAT PERSON HAS A ╓┴╪ ACCOUNT THEN
  35. ╔ COULD SET THEM UP WITH A MAILSERVER, IF A ╒╬╔╪ ACCOUNT THEN THERE'S OODLES
  36. OF THEM FLOATING ON THE NET THAT COULD BE USED. _╨╠┼┴╙┼_ WRITE TO ME AND
  37. LEMME KNOW IF YOU'RE INTERESTED. ╔'M GOING TO TRY TO GET ONE MORE ISSUE OF
  38. ├OMMODORE ╚ACKING OUT BEFORE ╩ULY 1ST.
  39.  
  40. ===========================================================================
  41.  
  42. ╨LEASE NOTE THAT THIS ISSUE AND PRIOR ONES ARE AVAILABLE VIA ANONYMOUS ╞╘╨
  43. FROM CCOSUN.CALTECH.EDU (AMONGUNDERS) UNDER /PUB/CBM/HACKING.MAG AND VIA A
  44. MAILSERVER WHICH DOCUMENTATION CAN BE OBTAINED BY SENDING MAIL TO
  45. "DUCK@PEMBVAX1.PEMBROKE.EDU" WITH A SUBJECT LINE OF "MAILSERVER" AND THE
  46. LINES OF "HELP" AND "CATALOG" IN THE BODY OF THE MESSAGE.
  47.  
  48. ===========================================================================
  49. ╠EGAL ═UMBO-╩UMBO
  50.  
  51. ╨ERMISSION IS GRANTED TO RE-DISTRIBUT3E THIS "NET-MAGAZINE", IN WHOLE,
  52. FREELY FOR NON-PROFIT USE. ╚OWEVER, PLEASE CONTACT INDIVIDUAL AUTHORS FOR
  53. PERMISSION TO PUBLISH OR RE-DISTRIBUTE ARTICLES SEPERATELY. ┴ CHARGE OF NO
  54. GREATER THAN 5 ╒╙ DOLLARS OR EQUIVLENT MAY BE CHARGED FOR LIBRARY SERVICE /
  55. DISKETTTE COSTS FOR THIS "NET-MAGAZINE".
  56.  
  57. ===========================================================================
  58. ╔N ╘HIS ╔SSUE:
  59.  
  60. ├OMMODORE ╘RIVIA ├ORNER
  61.  
  62. ╘HIS EDITION OF ├OMMODORE ╘RIVIA ├ORNER CONTAINS THE ANSWERS TO THE ╩ULY
  63. EDITION OF TRIVIA ($070 - $07╞), THE QUESTIONS AND ANSWERS FOR ┴UGUST ($080 -
  64. $08╞), ╙EPTEMBER ($090 - $09╞), ╧CTOBER ($0┴0 - $0┴╞), ╬OVEMBER ($0┬0 - $0┬╞),
  65. AND THE QUESTIONS FOR THE ─ECEMBER EDITION ($0├0 - $0├╞).  ┼NJOY THEM!
  66.  
  67. ┴ ─IFFERENT ╨ERSPECTIVE, PART ╔╔
  68.  
  69. ╘HIS MONTH ╟EORGE AND ╙TEVE CONTINUE THEIR SERIES ON 3─ GRAPHICS ON THE ├-64
  70. WITH A LOOK AT HIDDEN FACES AND FILLED FACES.  ╔N ADDITION TO ADDING THESE
  71. FEATURES INTO LAST MONTH'S PROGRAM SOME OTHER IMPROVEMENTS TO THE OLD PROGRAM
  72. WILL BE DISCUSSED, SUCH AS FAST MULTIPLICATION (AROUND 24 CYCLES) AND VARIOUS
  73. BUG FIXES -- FOR INSTANCE, THE PROGRAM NOW WORKS ON OLDER ├-64'S WHICH
  74. INITIALIZE COLOR ╥┴═ TO THE BACKGROUND COLOR WHEN THE SCREEN IS CLEARED (SORRY
  75. ABOUT THAT ;-).  ┴ VERY PRIMITIVE FORM OF TEXTURE MAPPING IS ALSO INCLUDED. ┴S
  76. USUAL, FULL SOURCE AND EXECUTABLES ARE INCLUDED.  ╘HE NATIVE ├64 FILES ARE IN A
  77. ╠YNX ARCHIVE, SO YOU WILL OBVIOUSLY NEED ╠YNX TO GET AT THEM -- CHECK YOUR
  78. FAVORITE ┬┬╙ OR ╞╘╨ SITE.
  79.  
  80. 2─ ╟RAPHICS ╘OOLBOX: ├IRCLES
  81.  
  82. ╘O AUGMENT THREE-DIMENSIONAL ALGORITHMS THIS SERIES WILL FOCUS ON
  83. TWO-DIMENSIONAL DRAWING ALGORTIHMS.  ├IRCLES ARE THE SUBJECT THIS
  84. TIME AROUND (HEH -- GET IT?), AND A VERY FAST ALGORITHM FOR DRAWING
  85. THEM ON YOUR ├64 IS PRESENTED, WITH EXAMPLES IN ASSEMBLY AND ┬┴╙╔├7.0.
  86. ╚OW FAST IS FAST?  ╚OW DOES 11 CYCLES PER PIXEL WITHOUT THE USE OF
  87. TABLES GRAB YA?
  88.  
  89. ┴╞╠╔=SPECS V1.0
  90.  
  91. ╔N ┴╞╠╔ WE CAN GET 120 COLORS IN THEORY (COUNTED LIKE THIS
  92. 16!/(2!*14!)=120). ╫HEN WE PUT RED AND BLUE HIRES PIXELS CLOSE TO
  93. EACH OTHER WE GET A VISION OF PURPLE - THANKS THE TELEVISION. ╘HIS ARTICLE
  94. DETAILS WHAT ┴╞╠╔ IS, HOW IT'S USED AND DONE.
  95.  
  96. ├ODING ╘RICKS
  97.  
  98. ╔NCLUDED ARE A SERIES OF POSTINGS TO COMP.SYS.CBM ABOUT NEAT CODING TRICKS (IN
  99. MACHINE LANGUAGE) THAT ARE INTERESTING AND USEFUL.
  100.  
  101. ├.╙.┬RUCE ╔NTERVIEW
  102.  
  103. ┴N INTERVIEW WITH THE AUTHOR OF ┌ED, THE ┴├┼ OS AND MANY OTHER NUMEROUS
  104. UTILITIES FOR THE ├OMMODORE 64/128.
  105.  
  106. ┴LIGNING 1541 ─RIVES
  107.  
  108. ┴ DISCUSSION REGARDING ├OMMODORE 1541 DISK DRIVE ALIGNMENT PROCEDURES, WITH
  109. SUGGESTIONS.
  110. ===========================================================================
  111. ├OMMODORE ╘RIVIA ├ORNER
  112. BY ╩IM ┬RAIN (BRAIN@MAIL.MSEN.COM)
  113.  
  114. ╫ELL, IT IS A NEW YEAR, AND ╔ AM SENDING UP A NEW COLLECTION OF THE
  115. ├OMMODORE RIVIA FOR ALL TO ENJOY.  ╔F YOU HAVEN'T SEEN THIS ALREADY, THE
  116. FOLLOWING IS A COLLECTION OF TRIVIA QUESTIONS THAT ╔ POST TO VARIOUS
  117. NETWORKS EVERY MONTH.  ╔ HAVE COLLECTED ╘RIVIA ┼DITION #8-13 IN THIS
  118. ARTICLE.  ┴S YOU MAY KNOW, THESE QUESTIONS FORM PART OF A CONTEST IN WHICH
  119. THE MONTHLY WINNER GETS A PRIZE (╘HANKS TO MY VARIOUS PRIZE DONATORS).
  120. ╘HE WHOLE THING IS MAINLY JUST FOR FUN, SO PLEASE ENJOY.
  121.  
  122. ┴S THE NEW YEAR ROLLS IN, ╔ AM HAPPY TO REPORT THE FOLLOWING:
  123.  
  124. 1) ┴S ╔ HAVE GAINED ACCESS TO ╞╔─╧╬ET, THE TRIVIA IS NOW POSTED TO BOTH
  125.    THE ╒╙┼╬┼╘ NEWSGROUP ├╧═╨.╙┘╙.├┬═ ON THE ╔NTERNET ┴╬─ THE ╞╔─╧╬ET ECHO
  126.    ├┬═ EVERY MONTH.
  127.  
  128. 2) ┴ NUMBER OF PUBLICATIONS HAVE STARTED PUBLISHING THE TRIVIA, INCLUDING
  129.    ├OMMODORE ╫ORLD, AND A VARIETY OF CLUB NEWSLETTERS.
  130.  
  131. 3) ╔ HAVE MOVED INTO MY NEW HOUSE (╙EE NEW ADDRESS AT BOTTOM).  ╫HILE THIS
  132.    MAY NOT SEEM IMPORTANT, THE EXTRA ROOM ╔ NOW HAVE MEANS ╔ CAN NOW BRING
  133.    ALL OF MY OLD ├┬═ MACHINE TO THE NEW HOUSE AND WORK WITH THEM.  ╫ORKING
  134.    WITH THEM GIVES ME FODDER FOR MORE TRIVIA.
  135.  
  136. ┴S ALWAYS, ╔ WELCOME ANY QUESTIONS (WITH ANSWERS), AND ENCOURAGE PEOPLE
  137. TO ENTER THEIR RESPONSES TO THE TRIVIA, NOW AT #13.  ┬E SURE YOU GET THE
  138. RESPONSES TO ME BY ╩ANUARY 12TH AT NOON.
  139.  
  140.  
  141. ╩IM.
  142.  
  143.  
  144. ╘HE FOLLOWING ARTICLE CONTAINS THE ANSWERS TO THE ╩ULY EDITION OF TRIVIA
  145. ($070 - $07╞), THE QUESTIONS AND ANSWERS FOR ┴UGUST ($080 - $08╞), ╙EPTEMBER
  146. ($090 - $09╞), ╧CTOBER ($0┴0 - $0┴╞), ╬OVEMBER ($0┬0 - $0┬╞), AND THE
  147. QUESTIONS FOR THE ─ECEMBER EDITION ($0├0 - $0├╞).  ┼NJOY THEM!
  148.  
  149.  
  150. ╚ERE ARE THE ANSWERS TO ├OMMODORE ╘RIVIA ┼DITION #8 FOR ╩ULY, 1994
  151.  
  152. ╤ $070) ╧N A ╨┼╘ SERIES COMPUTER, WHAT VISUAL POWER-ON INDICATION WILL TELL
  153.         THE USER WHETHER THE COMPUTER HAS ╥EVISION 2 OR ╥EVISION 3 ╥╧═S?
  154.  
  155. ┴ $070) ╥EVISION ╠EVEL 2 ╥╧═╙ (THE ONES WITH MORE BUGS) POWER UP WITH:
  156.         *** ├╧══╧─╧╥┼ ┬┴╙╔├ ***, WITH '*' IN PLACE OF THE MORE FAMILIAR
  157.         '#' CHARACTER.
  158.  
  159. ╤ $071) ╘HE ╔┼┼┼-488 INTERFACE IS SOMETIMES CALLED THE ╟╨╔┬ INTERFACE.
  160.         ╫HAT DOES ╟╨╔┬ STAND FOR?
  161.  
  162. ┴ $071) ╟ENERAL ╨URPOSE ╔NTERFACE ┬US.  ┴NOTHER NAME IS ╚EWLETT ╨ACKARD
  163.         ╔NTERFACE ┬US (╚╨╔┬), SINCE ╚╨ DEVELOPED THIS STANDARD FOR ITS
  164.         ISTRUMENTATION DEVICE NETWORKING.
  165.  
  166. ╤ $072) ├OMMODORE MANUFACTURED AT LEAST TWO HARD DRIVES WITH ╔┼┼┼-488
  167.         INTERFACES.  ├AN YOU NAME THEM?
  168.  
  169. ┴ $072) ╘HE ├OMMODORE ─9060 AND ─9090. ╞ROM THE CBMMODEL.TXT FILE:
  170.  
  171.         * ├┬═ ─9060  5 ═┬ ╚ARD ─RIVE, ─╧╙3.0, ╧FF-╫HITE, ╔┼┼┼-488.       ╟╨
  172.         * ├┬═ ─9090  7.5 ═┬ ╚ARD ─RIVE, ─╧╙3.0, ╧FF-╫HITE, ╔┼┼┼-488.     ╟╨
  173.  
  174.         ╘HE FOLLOWING MODEL HAS BEEN SAID TO BE IN EXISTENCE, THOUGH NO ONE
  175.         HAS ONE ON HAND TO PROVE IT:
  176.  
  177.         * ├┬═ ─9065  7.5 ═┬ ╚ARD ─RIVE
  178.  
  179.         ┴ND THIS MODEL MAY NEVER HAVE MADE IT PAST THE PROTOTYPE STAGE:
  180.  
  181.           ├┬═ ─9062  ─UAL ─9065.
  182.  
  183. ╤ $073) ╫HY DIDN'T BUYERS LIKE THE ORIGINAL ╨┼╘-64?
  184.  
  185. ┴ $073) ╔T LOOKED JUST LIKE A OLD-STYLE ├-64.  ╔T HAD A "HOME" COMPUTER
  186.         LOOK THAT THE SCHOOLS DIDN'T CARE FOR.  ╘HEY LIKED THE "BUSINESS"
  187.         LOOK OF THE ╨┼╘ SERIES, SO ├OMMODORE PUT REFURBISHED AND NEW 64
  188.         MOTHERBOARDS IN ╨┼╘ CASES AND SOLD THEM AS ╨┼╘ 64S.  ╘HE REPACKAGING
  189.         SUITED THE SCHOOLS.
  190.  
  191. ╤ $074) ╧N A ╨┼╘ ╥EVISION 2 ╥╧═, WHAT WAS THE LARGEST SINGLE ARRAY SIZE THAT
  192.         ┬┴╙╔├ COULD HANDLE?
  193.  
  194. ┴ $074) ┴N ARRAY CAN HAVE A CUMULATIVE TOTAL OF 256 ELEMENTS.  ╞OR SINGLE
  195.         DIMENSION ARRAYS, THAT MEANS ─(0) TO ─(255), BUT A 2─ ARRAY CAN ONLY
  196.         GO FROM ──(0,0) TO ──(1,127) ETC.  ┴LL TYPES OF ARRAYS HAD THIS
  197.         LIMITATION.
  198.  
  199. ╤ $075) ╧N THE STOCK 1541, DATA IS TRANSMITTED ONE BIT AT A TIME.  ╚OW MANY
  200.         BITS ARE TRANSFERRED AT A TIME ON THE ├OMMODORE 1551 DISK DRIVE?
  201.  
  202. ┴ $075) 3 BITS WERE TRANSMITTED AT A TIME.  ╔ ASSUME THAT EACH BYTE HAD A
  203.         PARITY BIT TACKED ON FOR ERROR DETECTION, SO IT WOULD HAVE TAKEN
  204.         3 TRANSFERS TO TRANSMIT A BYTE OF INFORMATION FROM THE DRIVES.
  205.  
  206. ╤ $076) ╧N ALL ├OMMODORE FLOPPY DISK DRIVES, HOW FAST DOES THE DISK SPIN?
  207.  
  208. ┴ $076) 300 ╥╨═.
  209.  
  210. ╤ $077) ╒PON FIRST READING THE ├OMMODORE 1541 ┼RROR CHANNEL AFTER TURNING
  211.         ON THE DISK DRIVE, WHAT ERROR NUMBER AND TEXT IS RETURNED?
  212.  
  213. ┴ $077) 73, ├┬═ ─╧╙ ╓2.6 1541, 0, 0
  214.  
  215. ╤ $078) ╫HAT ERROR NUMBER AND TEXT IS RETURNED ON A 1551?
  216.  
  217. ┴ $078) 73, ├┬═ ─╧╙ ╓2.6╘─╔╙╦, 0, 0   ╬OTICE THAT THE NEW TEXT ╩╒╙╘ FITS!
  218.  
  219. ╤ $079) ├OMMODORE PRINTERS ARE NORMALLY ASSIGNED TO DEVICE #4, BUT THEY
  220.         CAN BE ALSO USED AS DEVICE #?
  221.  
  222. ┴ $079) #5.  ╘HE ├OMMODORE 1525 HAS A SWITCH TO DO THIS, BUT NOT ALL PRINTERS
  223.         HAVE SUCH A SWITCH.
  224.  
  225. ╤ $07┴) ╫HAT MICROPROCESSOR IS USED IN THE ├OMMODORE 1551 DISK DRIVE?
  226.  
  227. ┴ $07┴) THE 6510╘.  ╔T IS A SLIGHT VARIANT ON THE 6510 MICROPROCESSOR USED
  228.         ON THE ├64.  ╙OME SAY IT RUNS AT 2 ═╚Z, BUT THE SPECS DRIVES SPEC
  229.         SHEET DOESN'T SAY.
  230.  
  231. ╤ $07┬) ╫HEN THE ╓╔├-20 WAS DESIGNED, THE SERIAL PORT THROUGHPUT WAS ROUGHLY
  232.         EQUIVALENT TO THE THROUGHPUT OF THE ╔┼┼┼-488 BUS?  ╫HY ISN'T IT
  233.         VERY FAST IN PRODUCTION ╓╔├S?
  234.  
  235. ┴ $07┬) ╠ET'S GO BACK TO QUESTION $04╞:
  236.  
  237.         <BEGIN INSERT>
  238.         ╤ $04╞) ╫HAT WAS THE PRIMARY REASON ├OMMODORE WENT TO A SERIAL BUS
  239.                 WITH THE INTRODUCTION OF THE ╓╔├-20?
  240.  
  241.         ┴ $04╞) ╩IM ┬UTTERFIELD SUPPLIED ME WITH THIS ONE:
  242.  
  243.                 ┴S YOU KNOW, THE FIRST ├OMMODORE COMPUTERS USED THE ╔┼┼┼ BUS
  244.                 TO CONNECT TO PERIPHERALS SUCH AS DISK AND PRINTER.  ╔
  245.                 UNDERSTAND THAT THESE WERE AVAILABLE ONLY FROM ONE SOURCE:
  246.                 ┬ELDEN CABLES.  ┴ COUPLE OF YEARS INTO ├OMMODORE'S COMPUTER
  247.                 CAREER, ┬ELDEN WENT OUT OF STOCK ON SUCH CABLES (MILITARY
  248.                 CONTRACT? WHO KNOWS?).  ╔N ANY CASE, ├OMMODORE WERE IN QUITE
  249.                 A FIX:  THEY MADE COMPUTERS AND DISK DRIVES, BUT COULDN'T
  250.                 HOOK 'EM TOGETHER! ╙O ╘RAMIEL ISSUED THE ORDER:  "╧N OUR NEXT
  251.                 COMPUTER, GET OFF THAT BUS.  ═AKE IT A CABLE ANYONE CAN
  252.                 MANUFACTURE".  ┴ND SO, STARTING WITH THE ╓╔├-20 THE SERIAL
  253.                 BUS WAS BORN.  ╔T WAS INTENDED TO BE JUST AS FAST AS THE
  254.                 ╔┼┼┼-488 IT REPLACED.
  255.         <END INSERT>
  256.  
  257.         ┴ND HERE IS WHAT ╩IM ┬UTTERFIELD FOLLOWED UP WITH:
  258.  
  259.         "╘ECHNICALLY, THE IDEA WAS SOUND:  THE 6522 ╓╔┴ CHIP HAS A "SHIFT
  260.         REGISTER" CIRCUIT THAT, IF TICKLED WITH THE RIGHT SIGNALS (DATA AND
  261.         CLOCK) WILL CHEERFULLY COLLECT 8 BITS OF DATA WITHOUT ANY HELP FROM
  262.         THE ├╨╒.  ┴T THAT TIME, IT WOULD SIGNAL THAT IT HAD A BYTE TO BE
  263.         COLLECTED, AND THE PROCESSOR WOULD DO SO, USING AN AUTOMATIC
  264.         HANDSHAKE BUILT INTO THE 6522 TO TRIGGER THE NEXT INCOMING BYTE.
  265.         ╘HINGS WORKED IN A SIMILAR WAY OUTGOING FROM THE COMPUTER, TOO.
  266.         ╫E EARLY ╨┼╘/├┬═ FREAKS KNEW, FROM PLAYING MUSIC, THAT THERE WAS
  267.         SOMETHING WRONG WITH THE 6522'S SHIFT REGISTER:  IT INTERFERED WITH
  268.         OTHER FUNCTIONS.  ╘HE RULE WAS:  TURN OFF THE MUSIC BEFORE YOU START
  269.         THE TAPE!  (╘HE SHIFT REGISTER WAS A POPULAR SOUND GENERATOR).  ┬UT
  270.         THE ├OMMODORE ENGINEERS, WHO ONLY MADE THE CHIP, DIDN'T KNOW THIS.
  271.         ╒NTIL THEY GOT INTO FINAL CHECKOUT OF THE ╓╔├-20.
  272.  
  273.         ┬Y THIS TIME, THE ╓╔├-20 BOARD WAS IN MANUFACTURE.  ┴ NEW CHIP COULD
  274.         BE DESIGNED IN A FEW MONTHS (YES, THE SILICON GUYS HAD APPLICATION
  275.         NOTES ABOUT THE PROBLEM, LONG SINCE), BUT IT WAS ╘╧╧ ╠┴╘┼!
  276.  
  277.         ┴ MAJOR SOFTWARE REWRITE HAD TO TAKE PLACE THAT CHANGED THE ╓╔├-20
  278.         INTO A "BIT-CATCHER" RATHER THAN A "CHARACTER-CATCHER".  ╔T CALLED FOR
  279.         EIGHT TIMES AS MUCH WORK ON THE PART OF THE ├╨╒; AND UNLIKE THE SHIFT
  280.         REGISTER PLAN, THERE WAS NO TIMING/HANDSHAKE SLACK TIME.  ╘HE WHOLE
  281.         THING SLOWED DOWN BY A FACTOR OF APPROXIMATELY 5 TO 6.
  282.  
  283.         ╫HEN THE 64 CAME OUT, THE PROBLEM ╓╔┴ 6522 CHIP HAD BEEN
  284.         REPLACED BY THE ├╔┴ 6526.  ╘HIS DID NOT HAVE THE SHIFT REGISTER
  285.         PROBLEM WHICH HAD CAUSED TROUBLE ON THE ╓╔├-20, AND AT THAT TIME IT
  286.         WOULD HAVE BEEN POSSIBLE TO RESTORE PLAN 1, A FAST SERIAL BUS.  ╬OTE
  287.         THAT THIS WOULD HAVE CALLED FOR A REDESIGN OF THE 1540 DISK DRIVE,
  288.         WHICH ALSO USED A ╓╔┴.  ┴S BEST ╔ CAN ESTIMATE - AND AN ARTICLE IN
  289.         THE ╔┼┼┼ ╙PECTRUM MAGAZINE SUPPORTS THIS - THE MATTER WAS DISCUSSED
  290.         WITHIN ├OMMODORE, AND IT WAS DECIDED THAT ╓╔├-20 COMPATIBILITY WAS
  291.         MORE IMPORTANT THAN DISK SPEED.  ╨ERHAPS THE PROSPECT OF A 1541
  292.         REDESIGN WAS AN IMPORTANT PART OF THE DECISION, SINCE CURRENT
  293.         INVENTORIES NEEDED TO BE TAKEN INTO ACCOUNT.  ┬UT TO KEEP THE
  294.         ├OMMODORE 64 AS A "BIT-BANGER", A NEW PROBLEM AROSE.
  295.  
  296.         ╘HE HIGHER-RESOLUTION SCREEN OF THE 64 (AS COMPARED TO THE ╓╔├-20)
  297.         COULD NOT BE SUPPORTED WITHOUT STOPPING THE ├╨╒ EVERY ONCE IN A WHILE.
  298.         ╘O BE EXACT:  ┼VERY 8 SCREEN RASTER LINES (EACH LINE OF TEXT), THE ├╨╒
  299.         HAD TO BE PUT INTO A ╫┴╔╘ CONDITION FOR 42 MICROSECONDS, SO AS TO
  300.         ALLOW THE NEXT LINE OF SCREEN TEXT AND COLOR NYBBLES TO BE SWEPT INTO
  301.         THE CHIP.(═ORE TIME WOULD BE NEEDED IF SPRITES WERE BEING USED).
  302.         ┬UT THE BITS WERE COMING IN ON THE SERIAL BUS FASTER THAN THAT:
  303.         A BIT WOULD COME IN ABOUT EVERY 20 MICROSECONDS!  ╙O THE POOR ├╨╒,
  304.         FROZEN FOR LONGER THAN THAT, WOULD MISS SOME SERIAL BITS COMPLETELY!
  305.         ├OMMODORE'S SOLUTION WAS TO SLOW DOWN THE SERIAL BUS EVEN MORE.
  306.         ╘HAT'S WHY THE ╓╔├-20 HAS A FASTER SERIAL BUS THAN THE 64, EVEN THOUGH
  307.         THE 64 WAS CAPABLE, TECHNICALLY, OF RUNNING MANY TIMES FASTER.
  308.  
  309.         ╞AST DISK FINALLY CAME INTO ITS OWN WITH THE ├OMMODORE 128."
  310.  
  311.                                  --╩IM
  312.  
  313. ╤ $07├) ╧N ├OMMODORE COMPUTERS, HOW MUCH ╥┴═ IS SET ASIDE AS A TAPE BUFFER?
  314.  
  315. ┴ $07├) 192 BYTES IS USED AS A TAPE BUFFER.  ┬LOCKS OF DATA ON TAPE ARE 192
  316.         BYTES LONG.
  317.  
  318. ╤ $07─) ╧N ├OMMODORE COMPUTERS, MOST EVERY PERIPHERAL HAS A DEVICE NUMBER.
  319.         ╫HAT IS THE DEVICE NUMBER OF THE SCREEN?
  320.  
  321. ┴ $07─) #3
  322.  
  323. ╤ $07┼) ╫HAT IS THE DEVICE NUMBER OF THE KEYBOARD?
  324.  
  325. ┴ $07┼) #0
  326.  
  327. ╤ $07╞) ├OMMODORE COMPUTERS USE 2'S-COMPLEMENT NOTATION TO REPRESENT INTEGERS.
  328.         ╫HAT IS THE 2'S-COMPLEMENT HEX REPRESENTATION OF THE SIGNLE BYTE -1?
  329.  
  330. ┴ $07╞) (╘HIS WAS NOT A ├OMMODORE SPECIFIC QUESTION)  ├OMMODORE COMPUTERS
  331.         USE THIS NOTATION TO REPRESENT INTEGER QUANTITIES.  ╔N 2'S COMPLEMENT
  332.         NOTATION, A -1 LOOKS LIKE 11111111(BINARY) OR $╞╞(HEX).
  333.  
  334.  
  335. ╚ERE ARE THE ANSWERS TO ├OMMODORE ╘RIVIA ┼DITION #9 FOR ┴UGUST, 1994
  336.  
  337. ╤ $080) ─URING THE DAYS OF THE ├OMMODORE 64 AND THE ╓╔├-20, ├OMMODORE
  338.         PRODUCED AT LEAST TWO ├OMMODORE MAGAZINES.  ╫HAT WERE THEIR NAMES?
  339.  
  340. ┴ $080) ╘HE MAGAZINES WERE ORIGINALLY CALLED "├OMMODORE ═ICROCOMPUTERS" AND
  341.         "╨OWER/╨LAY: ├OMMODORE ╚OME ├OMPUTING". ╘HEY NEVER DID SEEM TO NAIL
  342.         DOWN THE NAME OF THE LATTER AS ╔ SEE "╨OWER/╨LAY" AND
  343.         "├OMMODORE: ╨OWER/╨LAY" USED AS THE ORIGINAL NAMES AS WELL. ┴NYWAY,
  344.         ├OMMODORE ═ICROCOMPUTERS STARTED ITS LIFE IN 1979, WHEREAS
  345.         "╨OWER/╨LAY" STARTED IN 1981.  ┬OTH MAGAZINES WERE PUBLISHED UNTIL
  346.         AROUND 1987, WHEN THEY WERE MERGED TO FORM "├OMMODORE ═AGAZINE".
  347.         ╘HEN, AROUND 1990, THE MAGAZINE WAS SOLD TO ╔─╟ ├OMMUNICATIONS AND
  348.         WAS MERGED INTO ╥╒╬.  ╥╒╬ WAS CONTINUED FOR A WHILE, BUT WAS FINALLY
  349.         PULLED OUT OF CIRCULATION.  ├REATIVE ═ICRO ─ESIGNS PURCHASED THE
  350.         RIGHTS TO THE MAGAZINE, AND NOW ├OMMODORE ╫ORLD IS BEING PRODUCED BY
  351.         ├═─.  ╔ AM NOT SURE HOW STRONG (IF ANY) A LINK THERE IS BETWEEN
  352.         ╥╒╬ AND ├╫, BUT SOME OF THE SAME AUTHORS WRITE FOR THE NEW
  353.         PUBLICATION.  ╩UST FOR ADDED INFO, HERE ARE THE ╔╙╙╬ NUMBERS:
  354.  
  355.         ├OMMODORE ═ICROCOMPUTERS (├OMMODORE ═AGAZINE)   0744-8724
  356.         ╨OWER/╨LAY:├OMMODORE ╚OME ├OMPUTING             0739-8018
  357.         ╥╒╬ (├OMMODORE/╥╒╬)                             0741-4285
  358.  
  359.         "╘HE ╘RANSACTOR" IS ALSO A CORRECT ANSWER, AND INFO ON IT IS BELOW.
  360.  
  361. ╤ $081) ┬ACK IN THE ╨┼╘ HEYDAY, ANOTHER MAGAZINE WAS PRODUCED BY ├OMMODORE
  362.         ├ANADA.  ╘HIS MAGAZINE WAS LATER SOLD AND SHOWED UP AS A HARDWARE
  363.         JOURNAL.  ╬AME THE MAGAZINE.
  364.  
  365. ┴ $081) ╘HE INFAMOUS "╘ARNSACTOR".  ╧NE OF THE NOTED ├64 HARDWARE-HACKING
  366.         MAGAZINES, IT WAS ORIGINALLY PUBLISHED BY ├OMMODORE ├ANADA, BEFORE
  367.         BEING SOLD TO AN INDIVIDUAL NAMED ═R. ╚ILDEN.  ╔TS ╔╙╙╬ NUMBER IS
  368.         0838-0163.  ┴S FAR AS ╔ CAN TELL, THIS MAGAZINE, DIED MANY DEATHS,
  369.         BUT CEASED TO EXIST IN 1989-90.  ╔TS FIRST ISSUE IS DATED ┴PRIL 30,
  370.         1978.
  371.  
  372. ╤ $082) ╘HE ├OMMODORE 128 HAS A ╓╔├-╔╔ COMPATIBLE CHIP INSIDE IT.  ├AN THIS
  373.         CHIPS BE SWITCHED FOR A ╓╔├-╔╔ FROM A ├OMMODORE 64?
  374.  
  375. ┴ $082) ╬O!  ╘HE NEWER 128 COMPATIBLE CHIP (╓╔├-╔╔E) HAS 8 EXTRA PINS TO
  376.         PERFORM TIMING FUNCTIONS SPECIFIC FOR THE 128.  ╔N ADDITION, SOME OF
  377.         THE REGISTERS HAVE EXTRA FUNCTIONS.  ╚OWEVER, A SUITABLE CARD
  378.         TO MAKE IT COMPATIBLE CAN BE MADE.
  379.  
  380. ╤ $083) ╫HAT DOES THE VIDEO ENCODING STANDARD ╨┴╠ EXPAND TO?
  381.  
  382. ┴ $083) ╨HASE ┴LTERNATING ╠INE IS THE ANSWER ╔ WAS LOOKING FOR, WHICH
  383.         DESCRIBES THE VIDEO ENCODING USED IN ┼UROPE, BUT ╨ROGRAMMABLE ┴RRAY
  384.         ╠OGIC IS ALSO CORRECT, WHICH DESCRIBES THE FAMILY OF CHIPS USED AS
  385.         "GLUE" LOGIC FOR THE ├64 ╔/╧ AND PROCESSING CHIPS.
  386.  
  387. ╤ $084) ╚OW MANY BUTTONS WERE PRESENT ON THE EARLIEST OF ├OMMODORE TAPE DECKS?
  388.  
  389. ┴ $084) 5: ╨LAY, ╥EWIND, ╞AST-╞ORWARD, ╥ECORD, AND ╙TOP/┼JECT.  ╠ATER MODELS
  390.         SEPARATED THE STOP AND EJECT FUNCTIONS INTO TWO BUTTONS.
  391.  
  392. ╤ $085) ┼ARLIER ╙╔─ CHIPS HAD A DISTINCTIVE "CLICKING" SOUND THAT SOME DEMO
  393.         CODERS USED TO AN ADVANTAGE.  ├OMMODORE SUBSEQUENTLY REMOVED THE
  394.         CLICK, AND THEN LATER REINTRODUCED IT.  ╫HEN DOES THE TELLTALE CLICK
  395.         OCCUR?
  396.  
  397. ┴ $085) ╫HEN YOU CHANGE THE VOLUME OF A VOICE.  ╘HE VOICE NEED NOT BE
  398.         OUTPUTTING ANYTHING.
  399.  
  400. ╤ $086) ╫HAT DOES ├╨/═ STAND FOR?
  401.  
  402. ┴ $086) ╘AKE YOUR PICK:
  403.  
  404.         ├ONTROL ╨ROGRAM/═ONITOR
  405.         ├ONTROL ╨ROGRAM FOR ═ICROPROCESSORS
  406.         ├ONTROL ╨ROGRAM FOR ═ICROCOMPUTERS.
  407.  
  408.         ╘HE LAST ONE IS CONSIDERED BY MANY TO BE MOST CORRECT.
  409.  
  410. ╤ $087) ╫HAT IS THE HIGHEST LINE NUMBER ALLOWED FOR A PROGRAM LINE IN
  411.         ├OMMODORE ┬┴╙╔├ ╓2?
  412.  
  413. ┴ $087) ╬ORMALLY, THE USER CANNOT ENTER A LINE NUMBER HIGHER THAN 63999.
  414.         ╔F YOU WANT TO BE TRICKY, HOWEVER, THE NUMBERS CAN BE MADE TO GO UP
  415.         TO 65535.
  416.  
  417. ╤ $088) ╫HAT SYMBOL, CLEARLY PRINTED ON THE FRONT OF A KEY ON THE ├OMMODORE
  418.         ╓╔├, 64, AND 128 KEYBOARD, IS NOT AVAILABLE WHEN THE LOWER CASE
  419.         CHARACTER SET IS SWITCHED IN?
  420.  
  421. ┴ $088) ╘HE ╨╔ SYMBOL.  ╔T IS [╙╚╞╘-╒╨┴╥╥╧╫] IN UPPERCASE MODE, BUT BECOMES
  422.         A CHECKERBOARD-LIKE CHARACTER WHEN IN LOWER-CASE MODE.  ╒NLIKE THE
  423.         GRAPHICS CHARACTERS PRINTED ON THE FRONTS OF THE KEYS, THIS ONE IS
  424.         POSITIONED IN THE MIDDLE OF THE KEYCAP, AND SHOULD PROBABLY BE
  425.         ACCESSIBLE IN BOTH CHARACTER SETS.
  426.  
  427. ╤ $089) ╚OW DO YOU GET THE "CHECKMARK" CHARACTER ?
  428.  
  429. ┴ $089) ╔N LOWERCASE MODE, TYPE A SHIFT-@
  430.  
  431. ╤ $08┴) ╧N THE ╨┼╘ COMPUTERS, WHAT MEMORY LOCATION HOLDS THE ╦ERNAL ╥╧═
  432.         VERSION?
  433.  
  434. ┴ $08┴) ╔T IS DIFFERENT FROM THE 64/128.  ╔T IS 50003.  0 HERE INDICATES OLD
  435.         ╥╧═S, WHILE 1 INDICATES NEW ╥╧═S.
  436.  
  437. ╤ $08┬) ╘HE ├OMMODORE COMPUTERS HAVE 2 INTERRUPTS, CALLED ╔╥╤ AND ╬═╔.
  438.         ╫HAT DOES ╔╥╤ STAND FOR?
  439.  
  440. ┴ $08┬) ╔NTERRUPT ╥E╤UEST.  ╘HIS INTERRUPT IS USED FOR THINGS THAT SHOULD
  441.         USUALLY BE ALLOWED TO INTERRUPT THE PROCESSOR.  ╘HIS INTERRUPT CAN
  442.         BE MASKED OFF BY THE ╙┼╔ INSTRUCTION.
  443.  
  444. ╤ $08├) ╫HAT DOES ╬═╔ STAND FOR?
  445.  
  446. ┴ $08├) ╬ON-═ASKABLE ╔NTERRUPT.  ╒NLIKE THE ╔╥╤, THIS INTERRUPT CANNOT BE
  447.         MASKED BY AN INSTRUCTION.  ╚OWEVER, SOME TRICKS CAN BE USED TO
  448.         MASK IT.
  449.  
  450. ╤ $08─) ╘HE 6502 LINE OF MICROPROCESSORS HAS A NUMBER OF FLAGS THAT CAN BE
  451.         USED TO TEST FOR CERTAIN CONDITIONS.  ╧NE OF THEN IS THE ╬ FLAG.
  452.         ╫HAT DOES IT STAND FOR?
  453.  
  454. ┴ $08─) '╬' STANDS FOR ╬EGATIVE.  ╧N INSTRUCTIONS THAT CHANGE THIS FLAG, IT
  455.         IS SET TO BE EQUAL TO BIT 7 OF THE RESULT OF THE INSTRUCTION.
  456.  
  457. ╤ $08┼) ╚OW ABOUT THE ─ FLAG?
  458.  
  459. ┴ $08┼) ╔T STANDS FOR DECIMAL MODE.  ╘HIS MODE CAUSES CERTAIN INSTRUCTIONS
  460.         TO TREAT A BYTE AS 2 4 BIT ┬├─-CODED NYBBLES.
  461.  
  462. ╤ $08╞) ╘HE SHORTHAND FOR THE ┬┴╙╔├ KEYWORD ╨╥╔╬╘ IS '?'.  ╫HAT IS THE
  463.         SHORTHAND EQUIVALENT FOR ╨╥╔╬╘#?
  464.  
  465. ┴ $08╞) P╥ IS THE WAY TO ABBREVIATE ╨╥╔╬╘#.  ╬OTE THAT ?# WILL FAIL.
  466.  
  467.  
  468. ╚ERE ARE THE ANSWERS TO ├OMMODORE ╘RIVIA ┼DITION #10 FOR ╙EPTEMBER, 1994
  469.  
  470. ╤ $090) ╘HE 6502 HAS A RICH HISTORY.  ╔T IS MODELED AFTER ANOTHER 8-BIT
  471.         MICROPROCESSOR.  ╬AME THE PROCESSOR.
  472.  
  473. ┴ $090) ╘HE 65╪╪ SERIES OF PROCESSORS WAS MODELED AFTER THE ═OTOROLA 6800.
  474.         ═OTOROLA HAMPERED THE DESIGN GROUPS' EFFORTS TO PURSUE PRODUCT
  475.         DEVELOPMENTS USING THE 6800.  ┴ CORE GROUP OF 8 DESIGNERS LEFT ═OTOROLA
  476.         AND WENT TO ═╧╙ ╘ECHNOLOGIES, WHICH WAS THE LARGEST PRODUCER OF
  477.         CALCULATOR CHIPS AT THE TIME.  ═╧╙ DECIDED IT WAS TIME TO GO INTO
  478.         THE ├╨╒ BUSINESS.
  479.  
  480. ╤ $091) ╘HE 6502 HAS A OLDER BROTHER THAT WAS NEVER PRODUCED.  ╬AME ITS
  481.         NUMBER DESIGNATION AND WHY IT WAS NOT PRODUCED.
  482.  
  483. ┴ $091) ╘HE OLDER BROTHER TO THE 6502 WAS THE 6501.  ╘HE 6501 WAS
  484.         PIN-COMPATIBLE WITH THE 6800, WHICH PROMPTED A SUIT BY ═OTOROLA.
  485.         ┼VENTUALLY, ═╧╙ REACHED AN AGREEMENT WHERE THEY SCRAPPED THE 6501
  486.         MARKETING, BUT WERE FREE TO MARKET THE 6502.
  487.  
  488. ╤ $092) ╚OW MANY DIFFERENT OPCODES ARE CONSIDERED VALID AND "LEGAL" ON THE
  489.         ═╧╙ ╬═╧╙ 6502 LINE?
  490.  
  491. ┴ $092) 151 OPCODES ARE DOCUMENTED IN THE ╬═╧╙ 6502 DATA BOOK.  ╘HE REMAINING
  492.         105 OPCODES WERE NOT IMPLEMENTED, AND EXIST AS "DON'T CARE" STATES
  493.         IN THE OPCODE MATRIX.  ╘HAT MEANS THAT SOME SEEMINGLY INVALID
  494.         OPCODES WILL ACTUALLY PERFORM PIECES OF TWO OR MORE VALID OPCODES.
  495.         ╬EWER ├╨╒ SYSTEMS TRAP ALL NON-IMPLEMENTED OPCODE USAGES, BUT NOT
  496.         THE 6502.
  497.  
  498. ╤ $093) ┼VERY INSTRUCTION TAKES AT LEAST __ CYCLES TO COMPLETE.  ╞ILL IN
  499.         THE MISSING NUMBER.
  500.  
  501. ┴ $093) 2.  ╘HE ARCHITECTURE ASSUMES THAT EACH OPCODE HAS TWO BYTES IN IT AND
  502.         ONE BYTE CAN BE FETCHED PER CYCLE.  ╞OR INSTRUCTIONS THAT USE ONLY
  503.         1 BYTE, THE EXTRA FETCHED BYTE (ACTUALLY THE NEXT OPCODE), IS THROWN
  504.         AWAY.
  505.  
  506. ╤ $094) ╫HICH INSTRUCTIONS TAKE MORE TIME THAN NECESSARY AS A RESULT OF THE
  507.         ANSWER TO ╤ $093?
  508.  
  509. ┴ $094) ┴LTHOUGH THIS IS A SUBJECTIVE ANSWER, ╧NE COULD NOMINATE ╬╧╨ ON THE
  510.         BASIS THAT ╬╧╨ IS GENERALLY BELIEVED TO WASTE ONE EXECUTION CYCLE ON
  511.         A PARTICULAR PROCESSOR, NAMELY ONE CYCLE ON THE 65╪╪ LINE.  ╚OWEVER,
  512.         ONE CAN ARGUE THAT ╬╧╨ SIMPLY MEANS NO OPERATION, AND HAS NO TIES TO
  513.         LENGTH OF EXECUTION.  ┘OU BE THE JUDGE.
  514.  
  515.         ┴LL OTHER INSTRUCTIONS MUST TAKE AT LEAST TWO CYCLES: ONE FOR OPCODE
  516.         FETCH, ONE FOR OPERATION.
  517.  
  518. ╤ $095) ╫HAT DID ═╧╙ ╘ECHNOLOGIES MANUFACTURE BEFOR INTRODUCING THE 650╪ LINE
  519.         OF MICROPROCESSORS?
  520.  
  521. ┴ $095) ┴S STATED ABOVE, IT WAS CALCULATOR CHIPS.
  522.  
  523. ╤ $096) ╘HREE COMPANIES MANUFACTURED THE 6502 UNDER A CROSS-LICENSING
  524.         AGREEMENT.  ╬AME THEM.
  525.  
  526. ┴ $096) ╥OCKWELL, ═╧╙ ╘ECHNOLOGIES, AND ╙YNERTEK.
  527.  
  528. ╤ $097) ╔N ╬╘╙├-LAND, HOW FAST DOES THE 1═╚Z 6510 IN THE ├64 ACTUALLY RUN?
  529.  
  530. ┴ $097) 1.022727143 ═╚Z.  ╔T IS DERIVED BY TAKING THE MAIN CLOCK FREQUENCY
  531.         (14.31818═╚Z) AND DIVING IT BY 14.
  532.  
  533. ╤ $098) ╫HAT ABOUT IN ╨┴╠-LAND?
  534.  
  535. ┴ $098) 985.248449 K╚Z.  ╔T IS DERIVED BY TAKING THE MAIN CLOCK FREQUENCY
  536.         (17.734472═╚Z) AND DIVIDING IT BY 18.  ╘HUS THE ╨┴╠ 64 ACTUALLY RUNS
  537.         SLOWER THAN THE ╬╘╙├ ONE.
  538.  
  539. ╤ $099) ─ATA IS LATCHED INTO THE 650╪ MICROPROCESSOR ON THE (RISING/FALLING)
  540.         EDGE?
  541.  
  542. ┴ $099) ─ATA IS LATCHED IN TO THE 65╪╪ ON THE FALLING EDGE OF ╨HI0 (╨HI1).
  543.         ╘HE TIMING DIAGRAM IN SOME BOOKS (64 ╨╥╟ IS ONE) IS INCORRECT.
  544.  
  545. ╤ $09┴) ╘HROUGH THE YEARS, THE 650╪ LINE HAS CHANGED FAMILY NUMBERS, YET
  546.         THE PART HAS NOT BEEN CHANGED.  (┴ FAMILY NUMBER IS THE UPPER 2
  547.         DIGITS IN THIS CASE)  ╬AME THE OTHER FAMILY NUMBERS USED BY ═╧╙ TO
  548.         DENOTE THE 650╪ LINE.
  549.  
  550. ┴ $09┴) THE 75╪╪ LINE USED IN THE 264 SERIES (╨LUS/4 AND ├16), AND THE 85╪╪
  551.         SERIES USED IN THE ├64├ AND ├128 SERIES.
  552.  
  553. ╤ $09┬) ├ONSIDER THE FOLLOWING CODE:
  554.  
  555.         LDX #10
  556.         LDA $FF,X
  557.  
  558.         WHAT LOCATION DOES THE ACCUMULATOR GET LOADED WITH?
  559.  
  560. ┴ $09┬) ╘HE ANSWER IS LOCATION $FF+10 MOD 256 = $09.
  561.         ╘HE ANSWER INVOLVES EXPLAINING A (MIS)FEATURES OF THE ╬═╧╙ 65╪╪ ├╨╒
  562.         LINE.  ╘HE ABOVE CODE INSTRUCTS THE 65╪╪ ├╨╒ TO USE ZERO-PAGE
  563.         ADDRESSING MODE TO LOAD THE ACCUMULATOR.  ╔N ZERO-PAGE ADDRESSING, THE
  564.         ADDRESS NEED ONLY BE ONE BYTE WIDE ($FF IN THIS CASE), BECAUSE THE
  565.         HIGH BYTE IS CONSIDERED TO BE $00.  ╬OW, AS HUMANS, WE WOULD EXPECT
  566.         THE ├╨╒ WOULD ADD 10 TO 255 ($FF), GIVING 265 ($109) AS THE ADDRESS
  567.         TO LOAD THE ACCUMULATOR FROM.  ╚OWEVER, THE ├╨╒ DESIGNERS DECIDED
  568.         THAT ZERO-PAGE ADDRESSING MEANS THAT THE HIGH BYTE WILL BE $00 ALL THE
  569.         TIME, NO EXCEPTIONS.  ╔F A SITUATION LIKE THE ABOVE OCCURS, THE
  570.         LOW BYTE OF THE ADDITION WILL BE USED AS THE LOW BYTE OF THE ADDRESS
  571.         (9 IN THIS CASE), BUT THE HIGH-BYTE WILL BE ┌┼╥╧.  ┴LL ZERO PAGE
  572.         ADDRESSING MODES WORK THIS WAY.  ╬OTE THAT THE ├═╧╙ VERSIONS OF THE
  573.         6502 DO PERFORM THE HIGH BYTE "FIX-UP", SO THIS BEHAVIOR IS ONLY SEEN
  574.         ON THE ╬═╧╙ PARTS.
  575.  
  576. ╤ $09├) ╫HAT ABOUT THE FOLLOWING?
  577.  
  578.           LDX #10
  579.           LDA ($FF),X
  580.  
  581. ┴ $09├) ╘HIS WAS A TRICK.  ╘HE CODE IS TRYING TO USE ╔╬─╔╥┼├╘ ╔╬─┼╪┼─ INDEXING
  582.         MODE USING THE X REGISTER, BUT THAT ADDRESSING MODE CAN ONLY BE USED
  583.         WITH THE Y REGISTER.  ╔F THE CODE IS CHANGED TO THE FOLLOWING, LEGAL
  584.         CODE:
  585.  
  586.           LDX #10
  587.           LDA ($FF),Y
  588.  
  589.         ╘HEN, THE ABOVE DISCUSSION FOR ZERO-PAGE ADDRESSING HOLDS TRUE HERE
  590.         AS WELL.  ╘HE EFFECTIVE ADDRESS WOULD HAVE BEEN (HI:LO) $100:$0FF, BUT
  591.         IS INSTEAD (HI:LO) $000:$0FF.  ╘HE SIMPLE RULE IS:  ZERO PAGE MEANS
  592.         EXACTLY THAT.  ╘HERE IS NO WAY TO ADDRESS OUTSIDE OF ZERO-PAGE WITH
  593.         ZERO-PAGE ADDRESSING.
  594.  
  595. ╤ $09─) ╚OW MANY ├╨╒ CLOCK SIGNAL LINES DOES THE 650╪ REQUIRE TO RUN?
  596.  
  597. ┴ $09─) 1.  ╘HE 6501 USED TWO, AS THE 6800 USED TWO, BUT THE 6502 AND
  598.         SUCCESSORS ONLY REQUIRED ╨HI0 (╨HI1).  ╨HI2 WAS GENERATED ON THE ├╨╒.
  599.  
  600. ╤ $09┼) ╫HERE DOES THE 650╪ LINE FETCH ITS FIRST BYTE FROM AFTER RESET?
  601.  
  602. ┴ $09┼) $FFFC.  ╘HE ADDRESS FORMED BY READING $FFFD AND $FFFC IS STUFFED INTO
  603.         THE ╔╨, AND THE CODE IS READ STARTING THERE.  $FFFC IS READ FIRST,
  604.         SINCE THE 65╪╪ LINE STORES ADDRESSES IN LOW BYTE, HIGH BYTE FORMAT.
  605.  
  606. ╤ $09╞) ╧NE OF THE ORIGINAL DESIGNERS ON THE ╬═╧╙ 6502 ├╨╒ NOW HEADS UP
  607.         ╫ESTERN ─ESIGN ├ENTER IN ┴RIZONA, AND MAKES THE 65├02 AND 65├816
  608.         ├╨╒ CHIPS.  ╬AME HIM.  ╚INT: IT IS NOT ├HUCK ╨EDDLE!
  609.  
  610. ┴ $09╞) ┬ILL ═ENSCH.  ╚E HAND-DESIGNED THESE NEWER PARTS IN THE 65╪╪ LINE
  611.         IN THE SAME MANNER HE AND ├HUCK ╨EDDLE AND OTHERS HAND-DESIGNED THE
  612.         6501 AND 6502.
  613.  
  614.  
  615. ╚ERE ARE THE ANSWERS TO ├OMMODORE ╘RIVIA ┼DITION #11 FOR ╧CTOBER, 1994
  616.  
  617. ╤ $0┴0) ╔N THE MID 1980'S, ├OMMODORE INTRODUCED ╥┴═ ┼XPANSION ╒NITS FOR THE
  618.         ├OMMODORE 64, 64├, 128, AND 128─.  ╘HERE WERE THREE OF THEM.  ╟IVE
  619.         THEIR MODEL NUMBERS, AND WHAT WAS DIFFERENT AMONG THEM.
  620.  
  621. ┴ $0┴0) ╘HE 1700 (128K┬), THE 1764 (256K┬), AND THE 1750 (512K┬).  ╘HE
  622.         1700 AND THE 1750 WERE MARKETED FOR THE 128, WHILE THE 1764 WAS
  623.         MARKETED FROM THE 64 LINE.
  624.  
  625. ╤ $0┴1) ╙OME OF THE ├╔┴ INTEGRATED CIRCUITS USED ON THE ├64 AND ├128
  626.         COMPUTERS HAVE A HARDWARE DEFECT.  ╫HAT IS THE RESULT OF THIS
  627.         DEFECT, AND WHEN DOES IT OCCUR? (═AY BE MORE THAN ONE, BUT ╔ NEED
  628.         ONLY ONE)
  629.  
  630. ┴ $0┴1) ╘HE ONLY ONE ╔ HAVE DOCUMENTED IN FRONT OF ME IS THE TIMER ┬
  631.         INTERRUPT BUG, WHICH IS EXPLAINED IN THE "╘OWARD 2400" ARTICLE
  632.         BY ╟EORGE ╚UG IN ╘RANSACTOR 9.3. (1)  ╚OWEVER, ╔ HAD MANY PEOPLE
  633.         RELATE OTHER BUGS (2 AND 3), WHICH ╔ HAVEN'T BEEN ABLE TO TEST, SO ╔
  634.         ADD THEM AS POSSIBILITIES. (╔ ENCOURAGE READERS TO CONFIRM/DENY THE
  635.         LATTER 2.)
  636.  
  637.         1) ╔F TIMER ┬ OF THE 6526 ├╔┴ TIMES OUT AT ABOUT THE SAME TIME AS A
  638.            READ OF THE INTERRUPT REGISTER, THE TIMER ┬ FLAG MAY NOT BE SET AT
  639.            ALL, AND NO INTERRUPT WILL OCCUR IF TIMER ┬ INTERRUPTS WERE
  640.            TURNED ON.
  641.  
  642.         2) ╫HEN THE HOUR ON THE ╘╧─ CLOCK IS 12, THE ┴═/╨═ MUST BE REVERSED
  643.            FROM ITS NORMAL SETTING TO SET/RESET THE ┴═/╨═ FLAG.
  644.  
  645.         3) ╘HE ╘╧─ CLOCK SOMETIMES GENERATES DOUBLE INTERRUPTS FOR ALARM
  646.            TRIGGER.
  647.  
  648.  
  649. ╤ $0┴2) ╬AME THE ├OMMODORE MACHINE(S) ON WHICH A ╔NTEL 8088 WAS AN ╧╨╘╔╧╬┴╠
  650.         COPROCESSOR.  (╚INT, NOT THE ╔┬═ CLONES)
  651.  
  652. ┴ $0┴2) ╔ WAS LOOKING FOR THE ┬ SERIES COMPUTERS, WHICH CONTAINS THE ┬
  653.         COMPUTERS (┬128, ┬256), AS WELL AS THE 600 SERIES AND THE 700
  654.         SERIES.  ╘HESE COMPUTERS COULD BE FITTED WITH AN OPTIONAL 8088
  655.         PROCESSOR ON A SEPARATE CARD.  ╚OWEVER, ANOTHER CORRECT ANSWER IS
  656.         THE ┴MIGA, WHICH CAN HAVE A 8088 ATTACHED VIA AN EXPANSION CARD OR A
  657.         ╙IDE├AR(TM) UNIT.
  658.  
  659. ╤ $0┴3) ╧N ├OMMODORE COMPUTERS BESIDE THE ╨LUS/4 SERIES, THERE ARE THREE
  660.         FREQUENCIES USED TO RECORD THE DATA ON THE TAPE.  ╬AME THE
  661.         FREQUENCIES USED.
  662.  
  663. ┴ $0┴3) 1953.125╚Z, 2840.909╚Z, AND 1488.095╚Z.  ╘HESE CORRESPOND TO
  664.         WAVEFORMS WITH PERIODS: 512US, 352US, AND 672US, RESPECTIVELY.
  665.  
  666. ╤ $0┴4) ├OMMODORE ╨LUS/4 SERIES COMPUTERS CAN NOT READ ANY CASSETTES
  667.         RECORDED ON OTHER ├OMMODORE COMPUTERS.  ╫HY?  (╚INT: ╔T HAS
  668.         NOTHING TO DO WITH THE NONSTANDARD CONNECOTR ON THE ╨LUS/4)
  669.  
  670. ┴ $0┴4) ╘HE TONES RECORDED ON THE ╨LUS/4-├16 ARE EXACTLY ONE-HALF THE
  671.         FREQUENCIES SHOWN ABOVE.  ╘HIS SUGGESTS TO MANY THAT THE ╨LUS/4
  672.         AND ├16 WERE SUPPOSED TO RUN AT TWICE ITS PRESENT FREQUENCY,
  673.         BUT WERE DOWNGRADED AT THE LAST-MINUTE, AND THE CODE TO GENERATE
  674.         THE TONES WAS NOT UPDATED TO REFLECT THE CHANGE.  ╘HIS IS JUST
  675.         HERESAY, SO YOU DECIDE FOR YOURSELF.
  676.  
  677. ╤ $0┴5) ─URING POWER-UP, THE ├OMMODORE 64 CHECKS TO SEE IF IT RUNNING
  678.         IN ╨┴╠-LAND OR ╬╘╙├-LAND.  ╚OW DOES IT DETERMINE ITS LOCATION?
  679.  
  680. ┴ $0┴5) ╔T SETS THE RASTER COMPARE INTERRUPT TO GO OFF AT SCAN LINE 311.
  681.         ╔F THE INTERRUPT OCCURS, WE ARE ON A ╨┴╠ SYSTEM, SINCE ╬╘╙├ WILL
  682.         NEVER GET TO LINE 311 (╬╘╙├ ONLY HAS 262.5 LINES PER FRAME, EVERY
  683.         OTHER FRAME SHIFTED DOWN A BIT TO CREATE 525 LINES).
  684.  
  685. ╤ $0┴6) ╫HAT IS THE 65╪╪ ═╠ OPCODE FOR ┬╥╦?
  686.  
  687. ┴ $0┴6) $00, OR 00
  688.  
  689. ╤ $0┴7) ╧N THE 65╪╪ ├╨╒, WHAT GETS PUSHED ONTO THE STACK WHEN AN INTERRUPT
  690.         OCCURS?
  691.  
  692. ┴ $0┴7) ╘HE PROGRAM COUNTER GETS SAVED HIGH BYTE FIRST, THEN THE PROCESSOR
  693.         STATUS FLAGS GET SAVED.
  694.  
  695. ╤ $0┴8) ╙PEAKING OF THE STACK, WHERE IS THE STACK LOCATED IN THE 65╪╪ ADDRESS
  696.         MAP?
  697.  
  698. ┴ $0┴8) $0100 TO $01╞╞
  699.  
  700. ╤ $0┴9) ╧N THE 65╪╪ ├╨╒ LINE, IT IS POSSIBLE TO SET AND CLEAR A NUMBER OF
  701.         PROCESSOR STATUS FLAGS.  ┼XAMPLES INCLUDE ╙┼├ AND ├╠├ TO SET AND
  702.         CLEAR THE CARRY FLAG.  ╫HAT FLAG HAS A CLEAR OPCODE, BUT NO SET
  703.         OPCODE?
  704.  
  705. ┴ $0┴9) ╘HE OVERFLOW FLAG: ╓.  ╚OWEVER, THE ╓ FLAG CAN BE SET VIA AN EXTERNAL
  706.         PIN ON SOME MEMBERS OF THE 65╪╪ LINE.  ╘HE 1541 USES THIS AS AN
  707.         INGENIOUS SYNCHRONIZATION TOOL.
  708.  
  709. ╤ $0┴┴) ╫HEN SAVING A TEXT FILE TO TAPE, THE COMPUTER RECORDS 192 BYTES OF
  710.         DATA, AN INTER-RECORD GAP, AND THEN THE SAME 192 BYTES OF DATA
  711.         AGAIN.  ╚OW WIDE IS THIS INTER-RECORD GAP, AND WHY IS IT THERE?
  712.  
  713. ┴ $0┴┴) ╙OME TERMINOLOGY:  "INTER" MEANS "BETWEEN".  ═OST EVERYONE KNOWS
  714.         THAT A TAPE BLOCK IS RECORDED TWICE ON THE TAPE, BUT ├OMMODORE
  715.         CONSIDERS THE TWO COPIES AND THE GAP BETWEEN THEM A SINGLE
  716.         "RECORD".  ╘HUS, THIS QUESTION IS REFERRING TO THE GAP IN BETWEEN
  717.         TWO DISSIMILAR RECORDS.  ╫ITH THAT IN MIND,
  718.         THE INTERRECORD GAP IS NOMINALLY 2 SECONDS LONG, (OR 223.2 BYTE
  719.         LENGTHS, ALTHOUGH THE GAP CONTAINS NO DATA).  ╔T IS THERE TO ALLOW
  720.         THE TAPE MOTORS TO GET UP TO SPEED BEFORE THE NEXT DATA COMES UNDER
  721.         THE READ/WRITE HEAD.  ╘HE TAPE MOTORS MAY NEED TO STOP BETWEEN
  722.         RECORDS IF THE PROGRAM IS NOT REQUESTING ANY MORE DATA FROM THE
  723.         TAPE DATA FILE AT THIS TIME.  ╔F THE PROGRAM SUBSEQUENTLY ASKS
  724.         FOR DATA FROM THE TAPE, THE DRIVE MUST GET UP TO SPEED BEFORE THE
  725.         READ CAN OCCUR.  ╬OTE: ON THE FIRST VERSION OF ╨┼╘ ┬┴╙╔├, THE
  726.         GAP WAS TOO SMALL, SO PROGRAMMERS HAD PROBLEMS RETRIEVING DATA
  727.         FILES.
  728.  
  729.         ╞OR COMPLETENESS, THE "INTRA-RECORD" GAP (╘HE ONE BETWEEN THE TWO
  730.         COPIES OF THE DATA) CONSISTS OF 50+ SHORT PULSES, EACH OF WHICH IS
  731.         352US IN LENGTH, GIVING A TIMING OF .0176S+.  ╘HIS TIME WAS USED TO
  732.         COPY IMPORTANT DATA TO SAFE LOCATIONS, RESET POINTERS, AND DO ERROR
  733.         LOGGING.  ╘HE ENTIRE "RECORD" IS RECORDED IN 5.7 SECONDS.
  734.  
  735. ╤ $0┴┬) ╧N AN UNEXPANDED ╓╔├-20, WHERE DOES THE SCREEN MEMORY START?
  736.  
  737. ┴ $0┴┬) $1E00, OR 7680
  738.  
  739. ╤ $0┴├) ╔N ├OMMODORE ┬┴╙╔├, WHAT IS THE ABBREVIATED FORM OF THE "╠OAD"
  740.         COMMAND?
  741.  
  742. ┴ $0┴├) L╧ (╠ ╙╚╔╞╘-╧)
  743.  
  744. ╤ $0┴─) ╔N ├OMMODORE ┬┴╙╔├, WHAT IS THE ABBREVIATED FORM OF THE "╠IST"
  745.         COMMAND?
  746.  
  747. ┴ $0┴─) L╔ (╠ ╙╚╔╞╘-╔)
  748.  
  749. ╤ $0┴┼) ╧N THE ├OMMODORE 64, THERE IS SECTION OF 4 KILOBYTES OF ╥┴═ THAT
  750.         CANNOT BE USED FOR ┬┴╙╔├ PROGRAMS.  ╔T IS THE FAVORITE HIDING
  751.         PLACES FOR MANY ═╠ PROGRAMS, HOWEVER.  ╫HAT IS ITS ADDRESS IN
  752.         MEMORY?
  753.  
  754. ┴ $0┴┼) $C000, OR 49152
  755.  
  756. ╤ $0┴╞) ╫HAT IS STORED AT LOCATIONS $┴004-$┴00┬, AND WHY IS IT STRANGE?
  757.  
  758. ┴ $0┴╞) ╘HE TEXT "├┬═┬┴╙╔├" IS STORED THERE.  ╔T IS STRANGE BECAUSE THIS
  759.         TEXT IS NOT REFERENCED BY ANY ROUTINE.  ╔T CAN ALSO BE CALLED
  760.         STRANGE BECAUSE THE CODE IS ═ICROSOFT'S. ─OESN'T IT MAKE YOU WONDER?
  761.  
  762.  
  763. ╚ERE ARE THE ANSWERS TO ├OMMODORE ╘RIVIA ┼DITION #12 FOR ╬OVEMBER, 1994
  764.  
  765. ╤ $0┬0) ╫HAT WILL HAPPEN IF YOU TYPE ?""+-0 INTO THE ├┬═ ┬┴╙╔├ INTERPRETER
  766.         ON THE ╨┼╘ SERIES, THE 64 SERIES, OR THE 128 SERIES?
  767.  
  768. ┴ $0┬0) ╘HE ┬┴╙╔├ INTERPRETER HAS A BUG IN IT THAT SHOWS UP WHILE INTERPRETING
  769.         THE ABOVE STATEMENT.  ╘HE INTERPRETER LEAVES TWO BYTES ON THE ├╨╒
  770.         STACK PRIOR TO RETURNING FROM A SUBROUTINES CALL.  ┴T LEAST ON THE
  771.         ├64, THE TWO BYTES ARE BOTH ZEROS.  ╙INCE SUBROUTINES PUT THE RETURN
  772.         ADDRESS ON THE STACK, THE RETURN RETRIEVES THE TWO BYTES LEFT ON THE
  773.         STACK AND ATTEMPTS TO SE THAT AS THE RETURN ADDRESS.  ╙O, DEPENDING ON
  774.         WHAT CODE IT EXECUTES AFTER THE RETURN, IT CAN DO A NUMBER OF THINGS.
  775.  
  776.         ═OST OF THE TIME AFTER THE BUG OCCURS, THE INTERPRETER LIMPS ALONG
  777.         FOR A WHILE UNTIL IT HITS A ┬╥╦ INSTRUCTION, $00.  ╘HEN, THAT
  778.         INSTRUCTION CAUSES THE SYSTEM TO EXECUTE AN INTERRUPT.  ╧N THE ├64,
  779.         THE SYSTEM VECTORS THROUGH $316-$317 (┬╥╦ VECTOR) AND DOES A WARM
  780.         START.  ╧N THE ├128 AND ╨┼╘S WITH ═ONITORS, THE SYSTEM DUMPS INTO THE
  781.         INTERNAL MACHINE LANGUAGE MONITOR.  ╔F THE MACHINE UNDER USE DID NOT
  782.         DO SOMETHING WITH THE ┬╥╦ VECTOR, THE MACHINE WILL HANG.
  783.  
  784.         ╬OW, NOTE THAT THE ABOVE IS NOT THE ONLY RESULT.  ╙INCE THE
  785.         INTERPRETER IS EXECUTING CODE FROM THE WRONG LOCATION, ANY RESULT
  786.         FROM NO EFFECT TO HUNG MACHINE IS POSSIBLE.
  787.  
  788.         ╬OTE THAT THIS IS ╬╧╘ NORMAL BEHAVIOR.  ╘HE SYSTEM SHOULD REPORT AN
  789.         ERROR WHILE INTERPRETING THE ABOVE STATEMENT.
  790.  
  791. ╤ $0┬1) ╔N THE FIRST ├┬═ 64 UNITS, WHAT COLOR WAS THE SCREEN COLOR ╥┴═
  792.         CHANGED TO WHEN YOU CLEARED THE SCREEN?
  793.  
  794. ┴ $0┬1) ╘HE SCREEN COLOR ╥┴═ WAS CHANGED TO VALUE 1 WHEN THE SCREEN WAS
  795.         CLEARED.  ╘HUS, WHEN A BYTE WAS POKED INTO SCREEN ╥┴═, THE RESULTING
  796.         CHARACTER WAS WHITE ON THE SCREEN.  ╘HE WHITE CONTRASTED NICELY
  797.         WITH THE NORMAL BLUE BACKGROUND.
  798.  
  799. ╤ $0┬2) ╫HY WAS IT CHANGED IN LATER VERSIONS OF THE 64?
  800.  
  801. ┴ $0┬2) ├OMMODORE FOUND THAT THIS PRACTICE SOMETIMES CAUSED "LIGHT FLASHES"
  802.         DURING SCREEN SCROLLS.  ╔ WAS GOING TO LEAVE THIS FOR ANOTHER TIME,
  803.         BUT ... ╘HE CHANGE WAS TO MAKE THE COLOR ╥┴═ EQUAL TO BACKGROUND
  804.         COLOR REGISTER #0.  ╫ELL, THIS GOT RID OF THE "LIGHT FLASHES", BUT
  805.         THEN POKING VALUES TO SCREEN ╥┴═  CAUSED INVISIBLE CHARACTERS, SINCE
  806.         THE FOREGROUND COLOR OF THE CHARACTER WAS THE SAME AS THE BACKGROUND
  807.         COLOR OF THE SCREEN.
  808.  
  809.         ╫ELL, THIS BROKE A NUMBER OF OLDER PROGRAMS THAT DID NOT
  810.         PROPERLY INITIALIZE THE COLOR ╥┴═. ┴LSO, ├OMMODORE FIXED THE PROBLEM
  811.         WITH THE ╓╔├-╔╔ THAT HAD CAUSED THESE "LIGHT FLASHES" ╙O, ├OMMODORE
  812.         CHANGED THE ╦┼╥╬┴╠ A THIRD TIME.  ╙INCE THE ABOVE CHANGE CAUSED
  813.         INVISIBLE CHARACTERS, ├OMMODORE MADE A THIRD REVISION THAT CHANGED
  814.         THE COLOR ╥┴═ TO THE VALUE IN LOCATION 646 (THE CURRENT CURSOR
  815.         FOREGROUND COLOR).
  816.  
  817. ╤ $0┬3) ╫HAT IS "SPECIAL" ABOUT THE TEXT THAT DISPLAYS THE "ILLEGAL QUANTITY
  818.         ERROR" IN ├┬═ ┬┴╙╔├?
  819.  
  820. ┴ $0┬3) ╘HE TEXT IS ACTUALLY "?╔╠╠┼╟┴╠ ╤╒┴╬╘╔╘┘  ┼╥╥╧╥".  ╬OTICE THE TWO
  821.         SPACES BETWEEN "╤╒┴╬╘╔╘┘" AND "┼╥╥╧╥".  ╩OHN ╫EST SUPPLIES THE
  822.         EXPANANTION:
  823.  
  824.         "╘HE VECTOR AT $0300 POINTS TO A ROUTINE AT $┴43┴, WHICH IS THE
  825.         GENERAL ERROR MESSAGE PRINTING ROUTINE.  ╠OAD .╪ WITH THE NUMBER OF
  826.         THE ERROR, AND IT PRINTS IT.  IT LOOKS UP THE ADDRESS OF THE ERROR
  827.         TEXT FROM A TABLE, THEN PRINTS THE TEXT, WHICH DOES NOT HAVE ANY
  828.         TRAILING SPACES.  ╔T THEN PRINTS '  ┼╥╥╧╥', WITH *2* SPACES.  ╔T
  829.         DOES THIS FOR ALL ERRORS."
  830.  
  831.         ╚ISTORICALLY, THIS EFFECT IS CAUSED BY THE ╓╔├-20, WHICH ONLY HAD 22
  832.         COLUMNS.  ╫HEN THE ╓╔├-20 ┬┴╙╔├ WAS BEING PORTED FROM THE ╨┼╘ ┬┴╙╔├
  833.         CODE, SOMEONE NOTICED THAT THE SOME OF THE ERROR STRINGS WOULD
  834.         SPAN TWO ╓╔├-20 LINES.  ╙O, THE ┬┴╙╔├ ERROR MESSAGES WERE CHANGED
  835.         A LITTLE, SO THAT THEY ALL PRINTED NEATLY ON TWO LINES:  ╘HE ╨┼╘
  836.         ERROR STRING:
  837.            ?╔╠╠┼╟┴╠ ╤╒┴╬╘╔╘┘ ┼╥╥╧╥ (ONE SPACE) BECAME:
  838.            ?╔╠╠┼╟┴╠ ╤╒┴╬╘╔╘┘
  839.             ┼╥╥╧╥                  (CARRIAGE RETURN PLUS ONE SPACE).
  840.         ╫HEN THE ├64 ┬┴╙╔├ WAS BEING PORTED FROM THE ╓╔├-20, THE CARRIAGE
  841.         RETURN WAS REPLACED WITH A SPACE CHARACTER.
  842.  
  843.         ╔ ADMIT THIS CAUGHT ME BY SURPRISE.  ╔ HAVE USED ├OMMODORE COMPUTERS
  844.         FOR YEARS, AND NEVER NOTICED THAT "?╙┘╬╘┴╪  ┼╥╥╧╥" HAD 2 SPACES IN IT.
  845.  
  846. ╤ $0┬4) ╧N WHAT ├OMMODORE MACHINE WAS THE OPERATING SYSTEM ╧╙/9 AVAILABLE?
  847.  
  848. ┴ $0┬4) ╙INCE ╧╙/9 WAS A REAL-TIME OPERATING SYSTEM FOR THE 6809
  849.         MICROPROCESSOR, IT WAS AVAILABLE ON ONLY ONE ├OMMODORE MACHINE, WHICH
  850.         HAD TWO DIFFERENT NAMES:  ╘HE ├OMMODORE ╙UPER╨┼╘.  ╘HE MACHINE WAS
  851.         SOLD AS THE "══╞ (═ICRO ═AIN╞RAME) 9000 IN ╟ERMANY, AND ITS MODEL
  852.         NUMBER WAS ╙╨9000.
  853.  
  854. ╤ $0┬5) ╫HICH ├OMMODORE MACHINE(S) DOES NOT HAVE A USER PORT?
  855.  
  856. ┴ $0┬5) ╘HERE WERE A NUMBER OF ANSWERS TO THIS QUESTION, AND THERE MAY BE
  857.         MORE:
  858.  
  859.         ╘HE ├OMMODORE ├16.  ├OMMODORE DECIDED TO CUT OUT TELECOMMUNICATIONS,
  860.         AND THUS DESIGNED THE USER PORT OUT OF THE COMPUTER, AS THE MODEM IS
  861.         THE ONLY USE ├OMMODORE EVER MADE OF THE USER PORT.  ╘HIS ALSO
  862.         INCLUDES THE ├116, A VERSION OF THE ├16 WITH A CHICKLET KEYBOARD.
  863.  
  864.         ╘HE ├OMMODORE ╒LTIMAX/═┴╪ MACHINE.  ╘HIS WAS THE ILL-FATED GAME
  865.         CONSOLE PRODUCED IN THE EARLY 80S.  ╔T WAS BASICALLY A STRIPPED DOWN
  866.         ├OMMODORE 64.
  867.  
  868.         ╘HE 64 ╟╙ (╟AME ╙YSTEM).  ╘HIS MACHINE WAS ANOTHER FLOP PRODUCED
  869.         IN THE LATE 80S.
  870.  
  871. ╤ $0┬6) ╚OW MANY PINS ARE THERE IN A ├OMMODORE ╙ERIAL ├ONNECTOR?
  872.  
  873. ┴ $0┬6) 6.
  874.  
  875. ╤ $0┬7) ╘HERE ARE 13 ADDRESSING MODES AVAILABLE ON THE 6502. ╬AME THEM.
  876.  
  877. ┴ $0┬7) ╬O# ╬AME                 ─ESCRIPTION
  878.         --- ------------         -----------
  879.         01) ACCUMULATOR          ASL A
  880.         02) IMMEDIATE            LDA #$00
  881.         03) ZERO PAGE            LDA $00
  882.         04) ZERO PAGE,╪          LDA $00,╪
  883.         05) ZERO PAGE,┘          LDA $00,┘
  884.         06) ABSOLUTE             LDA $1000
  885.         07) ABSOLUTE,╪           LDA $1000,╪
  886.         08) ABSOLUTE,┘           LDA $1000,┘
  887.         09) IMPLIED              CLC
  888.         10) RELATIVE             BNE
  889.         11) (INDIRECT,╪)         LDA ($00,╪)
  890.         12) (INDIRECT),┘         LDA ($00),┘
  891.         13) (ABSOLUTE INDIRECT)  JMP ($1000)
  892.  
  893. ╤ $0┬8) ╔F YOU WERE TO PUT ONE LARGE SEQUENTIAL FILE ONTO AN 8050 DISK DRIVE,
  894.         HOW BIG COULD THAT FILE BE?
  895.  
  896. ┴ $0┬8) ┴CCORDING TO THE 8050 ╒SER ═ANUAL, A SEQUENTIAL FILE COULD BE
  897.         521208 BYTES IN SIZE.
  898.  
  899. ╤ $0┬9) ╚OW MANY CHARACTERS CAN BE PRESENT IN A STANDARD ├OMMODORE ─╧╙
  900.         FILENAME?
  901.  
  902. ┴ $0┬9) 16 CHARACTERS.
  903.  
  904. ╤ $0┬┴) ╚OW MANY PINS DOES A 6502 ╔├ HAVE ON IT?
  905.  
  906. ┴ $0┬┴) 40 PINS.
  907.  
  908. ╤ $0┬┬) ╚OW MANY PINS DOES THE STANDARD ╔┼┼┼-488 CONNECTOR HAVE ON IT?
  909.  
  910. ┴ $0┬┬) 24 PINS.
  911.  
  912. ╤ $0┬├) ╧N THE ╔┼┼┼-488 BUS, WHAT DOES THE ACRONYM FOR PIN 7, ╬╥╞─, STAND FOR?
  913.  
  914. ┴ $0┬├) ╬OT ╥EADY ╞OR ─ATA.
  915.  
  916. ╤ $0┬─) ╧N THE ╬═╧╙ 6502, WHAT IS THE ═╠ OPCODE FOR ╙┼─, AND WHAT DOES THIS
  917.         OPCODE DO?
  918.  
  919. ┴ $0┬─) $F8, ╙┼T ─ECIMAL MODE.  ╙ETS THE ─ FLAG IN THE STATUS FLAGS BYTE.
  920.         ┴LTHOUGH USED RARELY, THIS OPCODE SWITCHES ON ┬INARY ├ODED ─ECIMAL
  921.         MODE.  ╔N ┬├─ MODE, THE BYTE $10 IS TREATED AS 10, NOT 16.  ╘HE ADD
  922.         AND SUBTRACT INSTRUCTIONS ARE THE ONLY LEGAL ONES AFFECTED BY THIS
  923.         MODE, ALTHOUGH SOME UNDOCUMENTED/ILLEGAL OPCODES ARE ALSO AFFECTED.
  924.         ╞OR EXAMPLE, IN THIS MODE, ADDING THE BYTE $15 (21) TO THE BYTE $25
  925.         (37) YIELDS $40 (64) NOT $3A (58).  EMEMBER THAT, IN THIS MODE,
  926.         $40 = 40, NOT 64.
  927.  
  928. ╤ $0┬┼) ┴SSUMING A ╨┼╘ COMPUTER AND A NON-╨┼╘ COMPUTER HAVE ACCESS TO A
  929.         COMMON DISK DRIVE OR TAPE DRIVE, THERE ARE TWO WAYS TO LOAD A ╨┼╘
  930.         ┬┴╙╔├ PROGRAM ON THE NON ╨┼╘ ├┬═ COMPUTER. ╬AME THEM.
  931.  
  932. ┴ $0┬┼) ═OST DIFFERING SERIES OF ├OMMODORE COMPUTERS HAD DIFFERENT PLACES
  933.         FOR THE START OF ┬┴╙╔├ PROGRAMS.  ╞OR INSTANCE, ON THE ├64, $0801
  934.         (2049) IS THE START OF ┬┴╙╔├ MEMORY, BUT MOST ╨┼╘ COMPUTERS START
  935.         ┬┴╙╔├ MEMORY AT $0401 (1025).  ╘HIS WOULDN'T MATTER, EXCEPT THAT
  936.         ┬┴╙╔├ PROGRAMS ARE STORED ON TAPE AND DISK WITH THE START ADDRESS,
  937.         AND THE LINE LINKS IN A ┬┴╙╔├ PROGRAM HAVE ABSOLUTE ADDRESSES IN THEM.
  938.         ╘O FIX THESE PROBLEMS, THE ├OMMODORE ╓╔├-20 AND NEWER COMPUTERS CAME
  939.         OUT WITH A "RELOCATABLE LOAD".  ╙O, HERE ARE THE TWO CHOICES:
  940.  
  941.         1)  ╙AVE THE PROGRAM ON THE ╨┼╘ LIKE SO: SAVE "NAME",╪ (╪ IS DEVICE).
  942.             ╘HEN, YOU COULD LOAD THE PROGRAM INTO THE NON-╨┼╘ MACHINE
  943.             BY USING A RELOCATABLE LOAD: LOAD "NAME",╪.  ╘HIS WOULD LOAD THE
  944.             PROGRAM IN AT START OF ┬┴╙╔├ MEMORY AND REFIGURE THE LINE LINKS.
  945.  
  946.         2)  ╥EDEFINE START OF ┬┴╙╔├ MEMORY ON NON-╨┼╘ MACHINE.  ┴ COUPLE
  947.             OF POKES TO RELEVANT ┬┴╙╔├ POINTERS, AND THE START OF ┬┴╙╔├
  948.             WAS MOVED. ╘HEN, LOAD THE PROGRAM NON-RELOCATABLE.
  949.  
  950.         ╬OW, FROM THE ABOVE DISCUSSION, IT LOOKS LIKE OPTION 1 IS THE
  951.         SIMPLEST ROUTE.  ╫ELL, IT WOULD BE, EXEPT FOR ONE SMALL DETAIL:
  952.         ┼ARLIER ╨┼╘ COMPUTERS SAVED THE ┬┴╙╔├ PROGRAM FROM $0400, NOT
  953.         $0401 AS IS EXPECTED.  ╘HE EFFECT:  LOADING RELOCATABLE ON A NON-╨┼╘
  954.         WOULD HAVE A ZERO BYTE AS THE FIRST BYTE OF THE PROGRAM.  ╘HE QUICK
  955.         FIX:  CHANGE ┬┴╙╔├ POINTER TO ITSELF-1, LOAD ╨┼╘ PROGRAM, RESET
  956.         ┬┴╙╔├ POINTER.  ├OMMODORE DIDN'T MAKE IT EASY!
  957.  
  958. ╤ $0┬╞) ╧NLY ONE OF THE WAYS DETAILED IN $0┬┼ WORKS THE OTHER WAY AROUND.
  959.         ╫HICH ONE?
  960.  
  961. ┴ $0┬╞) ╙INCE THE EARLIER ╨┼╘ COMPUTERS DID NOT HAVE A "RELOCATABLE LOAD",
  962.         THE ONLY WAY TO LOAD A PROGRAM FROM, SAY, A ├64 INTO AN 2001 WAS TO
  963.         USE OPTION #2 ABOVE AND MOVE THE START OF ┬┴╙╔├ MEMORY TO $0801
  964.         (2049).
  965.  
  966.  
  967. ├OMMODORE ╘RIVIA ┼DITION #13
  968.  
  969. ╤ $0├0) ╘HE EARLY 1541 DRIVES USED A MECHANISM DEVELOPED BY ______.  ╬AME
  970.         THE COMPANY.
  971.  
  972. ╤ $0├1) ╧N LATER MODELS, ├OMMODORE SUBSEQUENTLY CHANGED MANUFACTURERS
  973.         FOR THE 1541 DRIVE MECHANISM.  ╬AME THE NEW MANUFACTURER.
  974.  
  975. ╤ $0├2) ╫HAT IS THE MOST OBVIOUS DIFFERENCE(S).  (╧NLY ONE DIFFERENCE IS
  976.         NECESSARY)
  977.  
  978. ╤ $0├3) ╧N ├OMMODORE ┬┴╙╔├ ╓2.0, WHAT ANSWER DOES THE FOLLOWING GIVE:
  979.         ╨╥╔╬╘ (╙╤╥(9)=3)
  980.  
  981. ╤ $0├4) ╔N ├OMMODORE ┬┴╙╔├ (┴NY VERSION) WHAT DOES ┬ EQUAL AFTER THE FOLLOWING
  982.         RUNS: ├=0:┬=├=0
  983.  
  984. ╤ $0├5) ╘HE FIRST ╨┼╘ CASSETTE DECKS WERE ACTUALLY _______ BRAND CASSETTE
  985.         PLAYERS, MODIFIED FOR THE ╨┼╘ COMPUTERS.  ╬AME THE COMAPNY.
  986.  
  987. ╤ $0├6) ╔N ├OMMODORE ┬┴╙╔├ (┴NY VERSION), WHAT HAPPENS IF THE FOLLOWING
  988.         PROGRAM IS RUN:
  989.  
  990.         10 ╩=0
  991.         20 ╔╞ ╩=0 ╟╧ ╘╧ 40
  992.         30 ╨╥╔╬╘ "╩<>0"
  993.         40 ╨╥╔╬╘ "╩=0"
  994.  
  995. ╤ $0├7) ╔N QUESTION $068, WE LEARNED HOW ╩ACK ╘RAMIEL FIRST HAPPENED UPON THE
  996.         NAME "├╧══╧─╧╥┼".  ┴CCORDING TO THE STORY, THOUGH, IN WHAT COUNTRY
  997.         WAS HE IN WHEN HE FIRST SAW IT?
  998.  
  999. ╤ $0├8) ╧N THE ├OMMODORE USER PORT CONNECTOR, HOW MANY EDGE CONTACTS ARE
  1000.         THERE?
  1001.  
  1002. ╤ $0├9) ╧N MOST ├OMMODORE COMPUTERS, A LOGICAL ┬┴╙╔├ LINE CAN CONTAIN UP TO
  1003.         80 CHARACTERS.  ╧N WHAT ├OMMODORE COMPUTER(S) IS THIS NOT TRUE?
  1004.  
  1005. ╤ $0├┴) ╔F A FILE IS SAVED TO A ├OMMODORE ─ISK ─RIVE WITH THE FOLLOWING
  1006.         CHARACTERS: CHR$(65);CHR$(160);CHR$(66), WHAT WILL THE DIRECTORY
  1007.         ENTRY LOOK LIKE?
  1008.  
  1009. ╤ $0├┬) ╫HAT IS THE MAXIMUM LENGTH (IN CHARACTERS) OF A ├┬═ DATASETTE
  1010.         FILENAME?
  1011.  
  1012. ╤ $0├├) ╚OW MANY KEYS ARE ON A STOCK ├OMMODORE 64 KEYBOARD?
  1013.  
  1014. ╤ $0├─) ├OMMODORE ┬┴╙╔├ USES KEYWORD "TOKENS" TO SAVE PROGRAM SPACE.  ╘OKEN
  1015.         129 BECOMES "╞╧╥".  ╫HAT TWO TOKENS EXPAND TO INCLUDE A LEFT
  1016.         PARENTHESIS AS WELL AS A ┬┴╙╔├ KEYWORD?
  1017.  
  1018. ╤ $0├┼) ╘HERE ARE 6 WIRES IN THE ├OMMODORE SERIAL BUS.  ╬AME THE 6 WIRES.
  1019.  
  1020. ╤ $0├╞) ╧N THE ├OMMODORE DATASETTE CONNECTOR, HOW MANY LOGICAL CONNECTIONS ARE
  1021.         THERE?
  1022.  
  1023. ╙OME ARE EASY, SOME ARE HARD, TRY YOUR HAND AT:
  1024.  
  1025.       ├OMMODORE ╘RIVIA ┼DITION #13!
  1026.  
  1027. ╩IM ┬RAIN
  1028. BRAIN@MAIL.MSEN.COM
  1029. 602 ╬ORTH ╠EMEN (╬EW ADDRESS)
  1030. ╞ENTON, ═╔  48430
  1031. (810) 737-7300 X8528
  1032.  
  1033. ==============================================================================
  1034. ┴ ─IFFERENT ╨ERSPECTIVE, PART ╔╔
  1035. BY ╟EORGE ╘AYLOR (AA601@CFN.CS.DAL.CA) AND ╙TEPHEN ╩UDD (SJUDD@NWU.EDU).
  1036.  
  1037. ╫E... ARE... ╓╥ ╘ROOPERS!  ╧KAY ╘ROOPERS, ONCE AGAIN WE NEED TO MAKE AN
  1038. EXCURSION OUT OF THE THREE DIMENSIONAL WORLD AND INTO OUR OWN LITTLE VIRTUAL
  1039. WORLD INSIDE THE ├64.  ╙O SIT BACK IN YOUR VIRTUAL CHAIR, PUT ON YOUR VIRTUAL
  1040. THINKING HELMET, MAYBE GRAB A VIRTUAL BEER, AND PREPARE FOR A VIRTUALLY
  1041. USEFUL EXPERIENCE WITH ANOTHER VIRTUALLY HUMONGOUS ARTICLE.
  1042.  
  1043. ╠AST TIME WE LAID DOWN THE FOUNDATIONS OF 3─ GRAPHICS: ROTATIONS AND
  1044. PROJECTIONS.  ╔N THIS ARTICLE WE WILL BUILD UPON THIS FOUNDATION WITH A LOOK
  1045. AT HIDDEN SURFACES AS WELL AS FILLED SURFACES.  ╔N ADDITION WE WILL SNAZ UP
  1046. THE OLD PROGRAM SO THAT IT IS A LITTLE MORE EFFICIENT BY FOR INSTANCE
  1047. INTRODUCING A MUCH FASTER MULTIPLICATION ROUTINE AND MOVING ALL VARIABLES
  1048. INTO ZERO-PAGE.
  1049.  
  1050. ╘O GET US IN THE MOOD LET'S REVIEW FROM LAST TIME.  ╫E ARE IN A
  1051. THREE-DIMENSIONAL SPACE; IN PARTICULAR, A RIGHT-HANDED THREE-DIMENSIONAL
  1052. SPACE, SO THAT THE X-AXIS COMES TOWARDS YOU, THE Y-AXIS INCREASES TO THE
  1053. RIGHT, AND THE Z-AXIS INCREASES "UP".  ╬OW WE HAVE SOME OBJECT, CENTERED AT
  1054. THE ORIGIN.
  1055.  
  1056. ╘O ROTATE THE OBJECT WE DERIVED A 3X3 MATRIX FOR EACH AXIS WHICH DESCRIBES A
  1057. ROTATION ABOUT THAT AXIS.  ┴FTER ROTATING WE TRANSLATE THE OBJECT ALONG THE
  1058. Z-AXIS AND THEN PROJECT IT THROUGH THE ORIGIN ONTO A PLANE Z=CONSTANT.
  1059.  
  1060. ┴S YOU RECALL THE PROJECTION OF A POINT IS DONE BY DRAWING A LINE FROM THE
  1061. POINT THROUGH THE ORIGIN, AND THEN FIGURING OUT WHERE THIS LINE INTERSECTS
  1062. OUR PLANE Z=CONSTANT.  ┘OU CAN THINK OF THIS LINE AS A RAY OF LIGHT BOUNCING
  1063. OFF THE OBJECT AND THROUGH OUR LITTLE PINHOLE CAMERA LENS.
  1064.  
  1065. ├LEARLY FOR ANY SOLID OBJECT SOME PARTS OF THE OBJECT WILL REMAIN HIDDEN,
  1066. THOUGH, I.E. WHEN YOU LOOK AT YOUR MONITOR YOU CAN'T SEE THE BACK OF IT, AND
  1067. YOU PROBABLY CAN'T SEE THE SIDES.  ╚OW DO WE CAPTURE THIS BEHAVIOR
  1068. MATHEMATICALLY?
  1069.  
  1070.  
  1071. ╚IDDEN ╙URFACES
  1072. ---------------
  1073.  
  1074. ╔MAGINE OUR OBJECT WITH SOME LIGHT SHINING ON IT -- WHEN WILL A PART OF THE
  1075. OBJECT BE HIDDEN?  ├LEARLY IT IS HIDDEN WHEN THE LIGHT REFLECTED OFF OF IT
  1076. NEVER REACHES OUR EYES, WHICH HAPPENS WHENEVER A PART OF THE OBJECT IS
  1077. "TURNED AWAY" FROM US.  ╚OW DO WE EXPRESS THIS MATHEMATICALLY? ├ONSIDER A
  1078. FLAT PLATE, LIKE YOUR HAND (YOU ALSO MIGHT THINK OF A CUBE).  ╬OW IMAGINE A
  1079. ROD STICKING OUT OF THE PLATE, EXACTLY PERPENDICULAR TO THE PLATE (TAKE YOUR
  1080. INDEX FINGER FROM YOUR OTHER HAND, AND TOUCH IT TO YOUR PALM AT A
  1081. NINETY-DEGREE ANGLE).  ╬OW ROTATE THE PLATE AROUND, AND IMAGINE THE LIGHT
  1082. BOUNCING OFF AND HEADING TOWARDS YOUR EYES.
  1083.  
  1084. ╬O MATTER WHERE YOU PLACE YOUR HAND IN SPACE, THE VERY LAST POINT AT WHICH IT
  1085. IS VISIBLE IS WHEN IT IS EXACTLY PARALLEL TO THE LIGHT RAYS COMING FROM IT TO
  1086. YOUR EYES; OR, TO PUT IT ANOTHER WAY, WHEN THE LIGHT RAYS ARE EXACTLY
  1087. PERPENDICULAR TO A NORMAL VECTOR TO THE SURFACE (IN THE ABOVE CASE THIS
  1088. VECTOR IS EITHER A ROD OR YOUR FINGER).  ╔F THE ANGLE BETWEEN THE NORMAL AND
  1089. A LIGHT RAY IS LESS THAN NINETY DEGREES, THEN THE SURFACE IS VISIBLE.  ╔F
  1090. GREATER, THEN THE SURFACE IS INVISIBLE.
  1091.  
  1092. ┴T THIS POINT YOU MAY BE WONDERING HOW TO FIGURE OUT THE ANGLE BETWEEN TWO
  1093. VECTORS.  ╔T TURNS OUT WE REALLY DON'T HAVE TO CALCULATE IT AT ALL: INSTEAD
  1094. WE USE A VERY IMPORTANT TOOL IN OUR MATHEMATICAL TOOLBOX, THE DOT PRODUCT.
  1095.  
  1096. ╔F WE HAVE TWO VECTORS V1=(X1,Y1,Z1) AND V2=(X2,Y2,Z2) THEN THE DOT PRODUCT
  1097. IS DEFINED TO BE
  1098.  
  1099.                 V1 DOT V2 = X1*Y1 + X2*Y2 + X3*Y3
  1100.  
  1101. NOTE THAT THIS IS A _SCALAR_ (I.E. A NUMBER), AND NOT A VECTOR.  ┘OU CAN ALSO
  1102. SHOW THAT
  1103.  
  1104.                 V1 DOT V2 = ▄V1▄*▄V2▄*COS(THETA)
  1105.  
  1106. WHERE ▄ ▄ DENOTES LENGTH AND THETA IS THE ANGLE BETWEEN THE TWO VECTORS.
  1107. ╙INCE COS(THETA) IS POSITIVE OR NEGATIVE DEPENDING ON WHETHER OR NOT THETA IS
  1108. LESS THAN OR GREATER THAN NINETY DEGREES, ALL WE HAVE TO DO IS TAKE THE DOT
  1109. PRODUCT AND LOOK AT THE SIGN.
  1110.  
  1111. ┬UT WE NEED TO UNDERSTAND SOMETHING ABOUT THE DOT-PRODUCT.  THETA IS THE
  1112. ANGLE BETWEEN TWO VECTORS JOINED AT THEIR BASE; MATHEMATICALLY THE WAY WE ARE
  1113. GOING TO DRAW THE LIGHT RAY IS TO DRAW A LINE ╞╥╧═ THE ORIGIN ╘╧ A POINT ON
  1114. THE SURFACE.  ╔N OUR MODEL ABOVE, WE ARE GOING TO DRAW A LINE FROM YOUR EYES
  1115. TO THE PALM OF YOUR HAND AND THEN SLIDE THE NORMAL VECTOR DOWN THIS LINE
  1116. UNTIL THE BASE OF THE NORMAL VECTOR TOUCHES YOUR EYE.
  1117.  
  1118. ╘HE WHOLE POINT OF THIS IS THAT WHEN WE LOOK AT THE DOT PRODUCT WE NEED TO
  1119. KEEP IN MIND THAT IF THE DOT PRODUCT IS NEGATIVE, THE FACE IS VISIBLE.
  1120.  
  1121. ┴LL THAT REMAINS IS TO WRITE DOWN AN EQUATION: LET'S SAY THAT WE'VE ROTATED
  1122. THE SURFACE AND KNOW A POINT ╨=(X,Y,Z) ON THE ROTATED SURFACE, AND WE HAVE A
  1123. NORMAL VECTOR TO THE SURFACE VN=(VX,VY,VZ).  ╞IRST WE NEED TO TRANSLATE DOWN
  1124. THE Z-AXIS SO THAT ╨ -> (X,Y,Z-Z0) = ╨ - (0,0,Z0).  ╔F WE THEN TAKE THE DOT
  1125. PRODUCT WE FIND THAT
  1126.  
  1127.         ╨' DOT VN = (╨ DOT VN) - Z0*VZ
  1128.  
  1129. ┬UT (╨ DOT VN) IS SIMPLY A CONSTANT: BECAUSE THESE ARE RIGID ROTATIONS THE
  1130. LENGTH OF ╨ NEVER CHANGES, PRESUMABLY THE LENGTH OF VN NEVER CHANGES, AND THE
  1131. ANGLE BETWEEN THE TWO NEVER CHANGES.  ╙O INTRODUCE A CONSTANT ╦ WHERE
  1132.  
  1133.         ╦ = (╨ DOT VN)/Z0
  1134.  
  1135. SO THAT ALL WE NEED TO DO IS SUBTRACT THE Z-COMPONENT OF THE NORMAL VECTOR
  1136. FROM ╦ AND CHECK IF IT IS POSITIVE OR NEGATIVE: IF NEGATIVE, THE FACE IS
  1137. VISIBLE.  ╬OTE THAT IF WE TRANSLATE BY AN AMOUNT ╨ + (0,0,Z0) (INSTEAD OF -
  1138. (0,0,Z0)) WE SIMPLY ADD THE TWO TOGETHER.
  1139.  
  1140. ╫E SEEM TO HAVE LEFT SOMETHING OUT HERE: HOW DO WE CALCULATE THE NORMAL
  1141. VECTOR VN?  ╧NE WAY TO DO IT IS BY USING ANOTHER VECTOR OPERATOR, THE
  1142. CROSS-PRODUCT.  ╘HE DOT PRODUCT OF TWO VECTORS IS JUST A SCALAR, BUT THE
  1143. CROSS PRODUCT OF TWO VECTORS IS ANOTHER VECTOR, PERPENDICULAR TO THE FIRST
  1144. TWO.
  1145.  
  1146. ╘HE MOST COMMON WAY TO VISUALIZE THE CROSS-PRODUCT IS BY USING YOUR RIGHT
  1147. HAND: IMAGINE TWO VECTORS IN SPACE, AND PLACE YOUR RIGHT HAND ALONG ONE OF
  1148. THEM, WITH YOUR THUMB STICKING OUT.  ╬OW CURL YOUR FINGERS TOWARDS THE OTHER
  1149. VECTOR.  ┘OUR THUMB POINTS IN THE DIRECTION OF THE VECTOR FORMED FROM THE
  1150. CROSS-PRODUCT OF THE FIRST TWO.  ┘OU CAN EASILY CONVINCE YOURSELF THEN THAT
  1151. (┴ X ┬) = -(┬ X ┴), THAT IS, IF YOU REVERSE THE ORDER OF THE CROSS PRODUCT,
  1152. YOU GET A VECTOR POINTING IN THE OPPOSITE DIRECTION.
  1153.  
  1154. ╘HEREFORE, IF WE TAKE ANY TWO VECTORS IN THE FACE (IN PARTICULAR, WE KNOW THE
  1155. EDGE OF THE FACE), AND THEN TAKE THEIR CROSS-PRODUCT, WE HAVE A NORMAL
  1156. VECTOR.
  1157.  
  1158. ┬UT BECAUSE WE ARE DEALING WITH A CUBE, WE HAVE AN EVEN EASIER METHOD!  ╫E
  1159. CAN USE THE FACT THAT THE FACES ON A CUBE ARE PERPENDICULAR TO EACH OTHER: IF
  1160. WE TAKE TWO POINTS AND SUBTRACT THEM WE GET A VECTOR GOING BETWEEN THE TWO
  1161. POINTS.  ╧N A CUBE, THIS WILL GIVE US A NORMAL VECTOR IF WE USE TWO
  1162. "OPPOSITE" POINTS.  ╘HEREFORE ALL WE NEED TO DO IS ROTATE THE CUBE, SUBTRACT
  1163. TWO Z-COORDINATES, ADD TO ╦, AND CHECK IF IT IS POSITIVE OR NEGATIVE.
  1164.  
  1165. ╘HIS IS HOW THE PROGRAM DOES IT, AND THE SPECIFICS WILL BE EXPLAINED LATER.
  1166. ╥IGHT NOW ╔ WANT TO SHOW YOU A SECOND METHOD OF HIDDEN SURFACE DETECTION.
  1167. ╔NSTEAD OF USING THE THREE-DIMENSIONAL ROTATE VECTORS, WHAT IF WE USE THE
  1168. TWO-DIMENSIONAL _PROJECTED_ VECTORS?  ╔F WE TAKE THE CROSS-PRODUCT OF TWO OF
  1169. THESE VECTORS WE GET A VECTOR WHICH EITHER POINTS INTO THE SCREEN OR OUT OF
  1170. IT, WHICH CORRESPONDS TO A POSITIVE OR A NEGATIVE RESULT.
  1171.  
  1172. ╘HE CROSS-PRODUCT IS USUALLY DONE BY TAKING THE DETERMINANT OF A MATRIX.  ╔
  1173. AM NOT GOING TO EXPLAIN THAT HERE -- YOU CAN LOOK IN ANY DECENT CALCULUS BOOK
  1174. FOR THE FULL CROSS-PRODUCT.  ┴LL WE REALLY CARE ABOUT IS THE Z-COORDINATE OF
  1175. THE VECTOR, AND THE Z-COORDINATE OF V1 X V2 IS:
  1176.  
  1177.         V1X*V2Y - V1Y*V2X
  1178.  
  1179. ╫HETHER OR NOT THE FACE IS VISIBLE DEPENDS ON HOW YOU DEFINE V1 AND V2!
  1180. ┴LWAYS REMEMBER THAT (V1 X V2) = -(V2 X V1).
  1181.  
  1182. ╫HAT IS THIS QUANTITY ANYWAYS?  ├ONSIDER A PARALLELOGRAM MADE UP OF OUR TWO
  1183. VECTORS V1 AND V2.  ╘HE MAGNITUDE OF THE CROSS-PRODUCT JUST HAPPENS TO BE
  1184.  
  1185.         ▄V1▄*▄V2▄*SIN(THETA)
  1186.  
  1187. WHICH YOU CAN EASILY SEE IS THE AREA OF A PARALLELOGRAM WITH SIDES V1 AND V2.
  1188. ╞OR THIS REASON THE SECOND METHOD APPARENTLY GOES BY THE NAME ╙┴═ -- ╙IGNED
  1189. ┴REA ═ETHOD.  (╬OW YOU NEED TO THINK ABOUT THE INTERPRETATION OF THE DOT
  1190. PRODUCT IN A SIMILAR WAY).
  1191.  
  1192. ╬OTE THAT THE SECOND METHOD IS QUITE GENERAL, WHILE THE FIRST METHOD ONLY
  1193. WORKS FOR OBJECTS WHICH HAVE PERPENDICULAR SURFACES (AT LEAST, IN IT'S
  1194. CURRENT FORM PRESENTED HERE).  ╧N THE OTHER HAND, THE FIRST METHOD IS
  1195. SIGNIFICANTLY FASTER.
  1196.  
  1197. ╬OW THAT WE'VE HIDDEN THE FACES, IT'S TIME TO FILL THEM:
  1198.  
  1199.  
  1200. ╞ILLED ╞ACES
  1201. ------------
  1202.  
  1203.         ╤: ╚OW DO YOU MAKE A STATUE OF AN ELEPHANT?
  1204.         ┴: ╙TART WITH A BLOCK OF GRANITE AND CARVE AWAY EVERYTHING
  1205.            THAT DOESN'T LOOK LIKE ELEPHANT!
  1206.  
  1207. ╘HE FIRST METHOD OF FILLING FACES IS VERY SIMPLE IN CONCEPT.  ╠ET'S SAY WE
  1208. WANT A CUBE WITH WHITE FACES AND BLACK EDGES.  ┬EFORE, THE PROGRAM WOULD MAKE
  1209. THE BUFFER BLACK AND THEN DRAW IN THE WHITE EDGES.  ╘HE IDEA HERE IS TO MAKE
  1210. THE ENTIRE BUFFER WHITE, DRAW THE EDGES IN BLACK, AND THEN MAKE EVERYTHING
  1211. OUTSIDE OF THE EDGES BLACK.  ╤UITE SIMPLY, WE START WITH A SOLID BLOCK AND
  1212. THEN TAKE AWAY EVERYTHING THAT DOESN'T LOOK LIKE A CUBE!  ┘OU CAN ALSO THINK
  1213. OF IT LIKE A COOKIE CUTTER: WE PRESS OUR CUBE-SHAPED CUTTER DOWN AND REMOVE
  1214. ALL THE DOUGH OUTSIDE OF THE CUTTER.
  1215.  
  1216. ╘HIS SIMPLISTIC METHOD ACTUALLY HAS SOME ADVANTAGES.  ╔F THE OBJECT IS VERY
  1217. LARGE, WE SPEND VERY LITTLE TIME DOING THE ACTUAL UN-FILLING. ╫E DON'T CARE
  1218. ABOUT HOW COMPLICATED THE OBJECT IS, BECAUSE WE JUST TRACE OUT THE EDGE.
  1219. ╞INALLY, THIS GIVES US AN EXTREMELY EASY WAY OF IMPLEMENTING A RUDIMENTARY
  1220. TEXTURE-MAPPING IN MULTICOLOR MODE.  ╞OR INSTANCE, INSTEAD OF COLORING THE
  1221. BLOCK WHITE, WHAT IF WE USED A CHANGING PATTERN OF COLORS?  ┴S LONG AS THE
  1222. EDGE IS A SPECIFIC COLOR, THE PATTERN CAN BE ANY COMBINATION OF THE OTHER
  1223. THREE COLORS.  ┴N EXAMPLE PROGRAM WHICH DOES JUST THIS IS INCLUDED -- NOTE
  1224. THAT THE INITITALIZATION PROGRAM NEEDS TO BE CHANGED SLIGHTLY TO RUN THIS
  1225. PROGRAM.
  1226.  
  1227. ╔N OTHER WORDS, WE ROLL THE DOUGH, DRAW A PATTERN INTO IT, PRESS OUR CUTTER
  1228. DOWN AND REMOVE THE OUTSIDE DOUGH.  ╫E ARE LEFT WITH A CUBE WITH PATTERNS ALL
  1229. OVER IT.
  1230.  
  1231. ╧N THE DOWNSIDE IT'S NOT QUITE SO EASY TO DO THINGS LIKE HAVE EACH FACE A
  1232. SEPARATE COLOR (BUT WHO WANTS WIMPY SEPARATE COLORS WHEN YOU CAN HAVE
  1233. EVOLVING TEXTURE PATTERNS, EH? :).
  1234.  
  1235. ╘HE PROGRAM MAKES A FEW REFINEMENTS TO THIS TECHNIQUE.  ╞OR INSTANCE, INSTEAD
  1236. OF COLORING THE ENTIRE BUFFER WHITE, IT CALCULATES AHEAD OF TIME THE MINIMUM
  1237. AND MAXIMUM VALUES FOR Y, AND ONLY COLORS THAT PART OF THE DRAWING AREA
  1238. WHITE.
  1239.  
  1240. ╞OR THE SAKE OF COMPLETENESS, HERE IS ANOTHER METHOD OF FILLING:
  1241. EXCLUSIVE-OR. ┴ CLEVER WAY OF FILLING FACES IS TO USE SOME ┼╧╥ MAGIC.  ╠ET'S
  1242. SAY WE WANT TO FILL EVERYTHING BETWEEN TWO POINTS ┴ AND ┬.  ╫E WANT TO START
  1243. FILLING AT POINT ┴ AND STOP AT POINT ┬, AND SINCE ┼╧╥ IS A BIT FLIPPER THIS
  1244. GIVES US A MEANS OF FILLING.  ├ONSIDER THE FOLLOWING SITUATION IN MEMORY:
  1245.  
  1246.         00010000  <-- ╨OINT ┴
  1247.         00000000
  1248.         00000000
  1249.         00010000  <-- ╨OINT ┬
  1250.  
  1251. ╬OW CONSIDER THE FOLLOWING LITTLE PIECE OF CODE:
  1252.  
  1253.         ╠─┴ #00
  1254.         ┼╧╥ ┴
  1255.         ╙╘┴ ┴
  1256.         ┼╧╥ ┴+1
  1257.         ╙╘┴ ┴+1
  1258.         ┼╧╥ ┴+2
  1259.         ╙╘┴ ┴+2
  1260.         ┼╧╥ ┴+3   ;POINT ┬
  1261.  
  1262. ╘HE RESULT IS:
  1263.  
  1264.         00010000
  1265.         00010000
  1266.         00010000
  1267.         00010000
  1268.  
  1269. ╘HIS IS THE CONCEPTUAL IDEA BEHIND AN ┼╧╥-BUFFER.  ╨RETTY NEAT, EH?  ┬UT WE
  1270. CAN'T JUST IMPLEMENT THIS AS-IS.  ╔N FACT WE HAVE A WHOLE SLEW OF THINGS TO
  1271. WORRY ABOUT NOW.  ╘RY ┼╧╥ING A VERTICAL LINE.  ╫HAT ABOUT WHEN TWO LINES
  1272. SHARE A SINGLE PIXEL AT THEIR INTERSECTION?  ╫HAT HAPPENS IN COLOR?
  1273.  
  1274. ┴H RECKON Y'ALL WILL JUST HAVE TO WAIT UNTIL NEXT TIME TUH SEE :).
  1275.  
  1276.  
  1277. ─A ╨ROGRAM
  1278. ----------
  1279.  
  1280. ╠ET'S REVIEW THE CODE.  ╫E CHECK TO SEE IF WE SHOULD INCREASE OR DECREASE THE
  1281. ROTATION RATE (OR QUIT), AND THEN UPDATE THE ANGLES. ╬EXT WE CALCULATE THE
  1282. ROTATION MATRIX USING A TABLE OF SINES AND COSINES. ╘HEN WE ROTATE AND
  1283. PROJECT THE POINTS BY USING A TABLE OF D/(Z/64-Z0) VALUES. ╙OMEWHERE IN THERE
  1284. WE CLEAR A WORKING BUFFER, DRAW ALL OF THE LINES, SWAP THE BUFFERS, PASS ╟O,
  1285. COLLECT $200 (ACTUALLY, CONSIDERING WHERE THE BUFFERS ARE LOCATED WE EITHER
  1286. COLLECT $300 OR $380 :), AND GO AROUND THE LOOP AGAIN.
  1287.  
  1288. ╞IRST, SOME BUGS.  ╘HERE WERE TWO PLACES IN THE LINE DRAWING ROUTINE WHERE AN
  1289. ╙┬├ WAS PERFORMED WITH THE CARRY CLEAR WHEN IT SHOULD HAVE BEEN SET, SO WE
  1290. NEED TO ADD SOME ╙┼├S IN THERE.  ╙OMEWHERE THERE IS A STRANGE BUG RELATED TO
  1291. Y-ROTATIONS, BUT ╔ DIDN'T TRACK IT DOWN.
  1292.  
  1293. ┴LTHOUGH NOT A BUG, THERE IS SOMETHING TO THINK ABOUT.  ╧N THE COMPUTER, X
  1294. INCREASES TO THE RIGHT, AND Y-INCREASES DOWNWARDS, WITH Z COMING OUT OF THE
  1295. SCREEN.  ┬UT THIS IS A LEFT-HANDED COORDINATE SYSTEM, AND ALL OUR
  1296. CALCULATIONS WERE PERFORMED IN A RIGHT-HANDED COORDINATE SYSTEM.  ╫HAT THIS
  1297. MEANS IS THAT ONE OF OUR COORDINATES IS ACTUALLY A MIRROR-IMAGE OF WHAT IT
  1298. SHOULD BE, WHILE THE OTHER COORDINATE IS WHERE IT IS SUPPOSED TO BE.
  1299. ╥EMEMBER THAT A PROJECTION GENERATES A NEGATIVE MIRROR-IMAGE OF THE OBJECT --
  1300. THE COMPUTER COORDINATE SYSTEM MIRRORS A SINGLE AXIS OF THE IMAGE AGAIN!
  1301.  
  1302. ┬ECAUSE OF THE SYMMETRY OF A CUBE, THIS MAKES NO DIFFERENCE. ┴ SMART WAY TO
  1303. FIX THIS IS TO TRANSLATE THE OBJECT IN _FRONT_ OF THE PROJECTION PLANE, I.E.
  1304. TO USE THE TRANSLATION Z=Z+C INSTEAD OF THE CURRENTLY USED Z=Z-C, BUT STILL
  1305. PROJECT THROUGH THE ORIGIN AND INTO THE PLANE Z=1.  ╙INCE ╔ AM NOT
  1306. PARTICULARLY SMART THOUGH, NOT TO MENTION LAZY AND UNMOTIVATED, ╔ DIDN'T
  1307. BOTHER TO FIX THIS.
  1308.         
  1309. ┬EFORE WE START ADDING THE NEW STUFF LIKE HIDDEN SURFACES INTO THE CODE, WHY
  1310. DON'T WE THINK ABOUT DOING SOME SIMPLE OPTIMIZATIONS TO THE OLD CODE?  ╧NE
  1311. REALLY EASY THING TO FIX IS IN THE PROJECTION ROUTINE.  ┘OU WILL RECALL THAT
  1312. THE EARLIER PROGRAM ROTATED Z AND THEN ADDED 128 TO IT TO USE AS AN INDEX.
  1313. ╫HY BOTHER TO ADD 128 AT ALL?  ╔ DUNNO -- SOMETIMES THINGS SEEM LIKE A GOOD
  1314. IDEA AT THE TIME.  ╙O THAT'S SOMETHING TO FIX. ╔T'S NOT THAT IT'S A BIG WASTE
  1315. OF TIME, IT'S JUST ONE OF THOSE ANNOYING THINGS THAT THERE'S NO REASON FOR.
  1316.  
  1317. ╚OW ABOUT THE VARIABLES?  ╘HEY'RE ALL JUST SITTING AT THE END OF THE PROGRAM
  1318. -- WHY NOT MOVE THEM ALL INTO ZERO PAGE?  ╙OUNDS GOOD TO ME!  ╫E JUST NEED TO
  1319. MAKE SURE WE DON'T USE ANY SENSITIVE LOCATIONS IN ZERO PAGE THAT WILL HOSE
  1320. THE WHOLE COMPUTER.  ╙O NOW THAT'S FIXED.
  1321.  
  1322. ╧N THE ├64 AN INTERRUPT IS PERFORMED EVERY 60TH OF A SECOND WHICH SCANS THE
  1323. KEYBOARD AND THINGS LIKE THAT -- WHY IN THE WORLD DO WE WANT THAT RUNNING IN
  1324. THE MIDDLE OF ALL OUR CALCULATIONS?  ╔ DUNNO -- LET'S TURN IT OFF (BUT TURN
  1325. IT BACK ON BEFORE CHECKING TO SEE IF ╞1 ETC. WAS PRESSED!).
  1326.  
  1327. ┴ FOOTNOTE OBSERVATION: WHEN THE ROTATION MATRIX IS CALCULATED, TWO MACROS
  1328. ARE USED (═╒╠2 AND ─╔╓2) WHICH MULTIPLY AND DIVIDE A SIGNED NUMBER BY TWO.
  1329. ╔T NEVER CEASES TO AMAZE ME WHAT HAPPENS WHEN YOU SIMPLY SIT DOWN AND THINK
  1330. ABOUT SOMETHING, AND IN THIS CASE THESE TWO MACROS CAN BE MADE MUCH SIMPLER:
  1331.  
  1332.         ═╒╠2    ┴╙╠     ;╘HAT'S ALL, FOLKS
  1333.  
  1334.         ─╔╓2    ├╠├
  1335.                 ┬╨╠ :╨╧╙
  1336.                 ╙┼├
  1337.         :╨╧╙    ╥╧╥
  1338.  
  1339. ╘HESE TWO ROUTINES WILL MULTIPLY/DIVIDE A SIGNED 2'S COMPLEMENT NUMBER
  1340. BY TWO (NOTE THAT THE SOURCE INCLUDED WITH THIS ARTICLE USES THE OLD METHOD).
  1341.         
  1342. ╘HERE'S THE EASY STUFF TO FIX.  ╫HAT ABOUT THE CALCULATIONS THEMSELVES? ╘HE
  1343. ROTATION IS PRETTY STRAIGHTFORWARD -- NAH, SKIP THAT.  ╘HE LINE DRAWING
  1344. ROUTINE TAKES UP AN AWFUL LOT OF TIME -- MAYBE WE CAN SPEED THAT UP?  ╘HAT'S
  1345. FOR A FUTURE ARTICLE :).  ├LEARING THE BUFFER TAKES A LOT OF TIME, BUT NOW
  1346. THAT WE'RE GOING TO HAVE FILLED FACES THERE ISN'T TOO MUCH WE CAN DO ABOUT
  1347. THAT.  ╔N FACT, SO MUCH MORE TIME IS SPENT IN THOSE TWO AREAS THAN IS SPENT
  1348. IN OTHER PARTS OF THE CODE THAT ANY OTHER OPTIMIZATIONS WE MAKE REALLY AREN'T
  1349. GOING TO MAKE A VERY BIG DIFFERENCE... ┬╒╘...
  1350.  
  1351. ╚OW ABOUT MULTIPLICATIONS?
  1352.  
  1353.  
  1354. ╞AST ╙IGNED ═ULTIPLY
  1355. --------------------
  1356.  
  1357. ┴H, NOW HERE IS SOMETHING WE CAN FIX.  ├ONSIDER THE FOLLOWING FUNCTION:
  1358.  
  1359.         F(X) = X*X/4
  1360.  
  1361. ╬OW NOTICE THAT
  1362.  
  1363.         F(A+B) - F(A-B) = A*B
  1364.  
  1365. ╫OWSERS!  ┴LL WE NEED TO DO IS HAVE A TABLE OF SQUARES, AND WE CAN DO A
  1366. MULTIPLICATION IN NO TIME!
  1367.  
  1368. ╫HOA THERE, WAIT A MINUTE, ALL OF OUR CALCULATIONS ARE USING SIGNED NUMBERS.
  1369. ╫ON'T THAT MAKE A DIFFERENCE?  ╫ELL, THE ABOVE CALCULATION IS COMPLETELY
  1370. GENERAL -- ╔ NEVER SAID WHAT THE SIGN OF A AND B ARE.  ╘HE FACT THAT WE ARE
  1371. USING TWO'S COMPLEMENT NOTATION MAKES THIS EVEN SIMPLER!
  1372.  
  1373. ╥ECALL THAT OUR MULTIPLICATION IS
  1374.  
  1375.         X -> X * [D/(Z0-Z/64)]
  1376.  
  1377. WHERE X IS A SIGNED FLOATING POINT NUMBER MULTIPLIED BY 64 (THAT IS,  INSTEAD
  1378. OF GOING FROM -1 TO 1 X WOULD GO FROM -64 TO 64).  ╨REVIOUSLY WE MADE D
  1379. LARGE, SO THAT THE TABLE OF D/(Z-Z0) WOULD BE MORE ACCURATE. ╘HEN WE
  1380. MULTIPLIED THE NUMBERS TOGETHER AND DIVIDED BY 64, A PROCEDURE WHICH TOOK
  1381. BETWEEN 150 AND 180 CYCLES, LEAVING US WITH A SIGNED, 8-BIT RESULT.
  1382.  
  1383. ╫ELL, THAT'S EASY TO DUPLICATE.  ╞ROM OUR FIRST EQUATION ABOVE, WE SEE THAT
  1384.  
  1385.         (A*B)/64 = [ F(A+B) - F(A-B) ]/64
  1386.                  = G(A+B) - G(A-B)
  1387. WHERE
  1388.         G(X) = X*X/256.
  1389.  
  1390. ╔N OTHER WORDS, IF WE MODIFY OUR TABLE SLIGHTLY, WE GET EXACTLY THE RESULT WE
  1391. WANT.  ╙O HERE IS THE CODE TO MULTIPLY TWO NUMBERS TOGETHER:
  1392.  
  1393. * ┴*┘ -> ┴  ╙IGNED, 8-BIT RESULT
  1394.  
  1395.         ╙╘┴ ┌╨1         ;┌╨1 -- ZERO PAGE POINTER TO TABLE OF G(X)
  1396.         ┼╧╥ #$╞╞
  1397.         ├╠├
  1398.         ┴─├ #$01
  1399.         ╙╘┴ ┌╨2         ;┌╨2 ALSO POINTS TO G(X)
  1400.         ╠─┴ (┌╨1),┘     ;G(┘+┴)
  1401.         ╙┼├
  1402.         ╙┬├ (┌╨2),┘     ;G(┘-┴)
  1403.  
  1404. ┴ND THAT'S IT -- WE'RE DONE.  ╘HE ABOVE TAKES 24-26 CYCLES TO EXECUTE -- NOT
  1405. BAD AT ALL!  ┘ES, WITH ANOTHER TABLE WE COULD MAKE IT EVEN FASTER, BUT THIS
  1406. IS GOOD ENOUGH FOR US.
  1407.  
  1408. ┴T THE MOMENT WE DON'T DO VERY MANY MULTIPLICATIONS, BUT IN THE FUTURE, WHEN
  1409. WE WRITE A GENERALIZED ROUTINE TO ROTATE AND PROJECT AN ARBITRARY OBJECT,
  1410. THIS WILL GIVE US A HUMONGOUS TIME SAVINGS.
  1411.  
  1412. ┴STUTE READERS MAY BE THINKING AHEAD HERE: IN THE PROGRAM, FOR EACH
  1413. PROJECTION WE HAVE TWO MULTIPLICATIONS, X=X*C AND Y=Y*C, WHERE C IS THE SAME
  1414. IN BOTH CASES.  ╙O IF WE STORE C IN ┌╨1 AND ┌╨2, WE CAN MAKE THE
  1415. MULTIPLICATION EVEN MORE EFFICIENT, RIGHT?  ╘HE ANSWER IS YES, BUT ONLY BY
  1416. BEING EXTREMELY CAREFUL, FOR REASONS THAT WILL BE DETAILED IN EXACTLY TWO
  1417. PARAGRAPHS.
  1418.         
  1419. ┬╒╘ ╫┴╔╘!  ╫E HAVE TO THINK ABOUT A FEW THINGS HERE.  ╫HAT HAPPENS WHEN WE
  1420. MULTIPLY, SAY, -1 * -1.  ╔N TWO'S COMPLEMENT NOTATION -1 IS EQUAL TO 255.  ╙O
  1421. OUR ABOVE ALGORITHM ADDS 255 TO 255 TO GET AN INDEX INTO THE TABLE AND
  1422. GETS... OOPS!  ╧UR TABLE NEEDS TO BE LARGER THAN 256 BYTES!  ╔N FACT THIS IS
  1423. VERY EASY TO FIX, BECAUSE OF THE WAY TWO'S COMPLEMENT WORKS.  ┴LL WE NEED TO
  1424. DO IS PUT AN EXACT COPY OF THE 256 BYTE TABLE ON TOP OF ITSELF, AND THE TABLE
  1425. WILL WORK FINE.  (╔F YOU LOOK AT THE INITIALIZATION PROGRAM YOU WILL NOTICE
  1426. THAT THE STATEMENT IS: Q%=S*S:POKE BM+J,Q%:POKE BM+J+256,Q%).
  1427.  
  1428. ┬╒╘ ╫┴╔╘!!!  ╫HAT KINDS OF NUMBERS ARE WE MULTIPLYING TOGETHER HERE? ╧UR
  1429. VERTICES START OUT AT THE POINTS (+/-1,+/-1,+/-1).  ╧UR ROTATIONS CORRESPOND
  1430. TO MOVING THESE POINTS AROUND ON A SPHERE, SO IT IS EASY TO SEE THAT THE
  1431. LARGEST ROTATED VALUE WE CAN HAVE IS SQR(3), THE RADIUS OF THIS SPHERE.
  1432. ╙INCE WE ARE MULTIPLYING THESE NUMBERS BY 64, THE LARGEST VALUE WE CAN HAVE
  1433. FOR THESE NUMBERS IS 64*SQR(3) = 111.  ╧KAY, NO BIG WHOOP, WHAT ARE THE
  1434. VALUES FOR D/(Z0-Z/64) ANYWAYS?  ╫ELL, FOR Z0=5 AND D=150 SAY WE GET VALUES
  1435. LIKE 28...
  1436.  
  1437. ┴├╦!  ╫HEN WE GO TO MULTIPLY WE ARE GOING TO ADD 111 TO 28 AND GET 137, BUT
  1438. IN TWO'S COMPLEMENT NOTATION THIS IS EQUAL TO -119.
  1439.  
  1440. ┼XAMPLE:
  1441.         A=28
  1442.         B=111
  1443.         F(B+A) = F(137) = F(-119) IN TWO'S-COMPLEMENT NOTATION
  1444.         F(B-A) = F(83)
  1445.  
  1446. ╔N OUR TABLE LOOKUP WE REALLY WANT 137*137 BUT WE ARE GOING TO GET -119*-119!
  1447. ╧NE OPTION IS TO NEVER CHOOSE D VERY LARGE SO THAT WE DON'T HAVE THIS
  1448. PROBLEM, BUT THE SOLUTION TURNS OUT TO BE MUCH SIMPLER, AGAIN DUE TO THE WAY
  1449. TWO'S COMPLEMENTING WORKS.
  1450.  
  1451. ╫E CAN SEE THAT WE CAN GET NUMBERS LARGER THAN 127 WHEN WE ADD THE TWO
  1452. MULTIPLICANDS TOGETHER.  ╫HAT IS THE _SMALLEST_ NUMBER WE WILL COME UP WITH?
  1453. ├ERTAINLY THE SMALLEST X IS GOING TO GET IS -111. ┴HHH... D/(Z0-Z/64) IS
  1454. ALWAYS POSITIVE, SO WHEN WE ADD THEM TOGETHER WE WILL GET SOMETHING LARGER
  1455. THAN -111, WHICH IN TWO'S COMPLEMENT NOTATION IS 145.  ╘HIS MEANS THAT WE CAN
  1456. TREAT THE TABLE ENTRIES BETWEEN 127 AND AT LEAST 145 AS POSITIVE NUMBERS
  1457. INSTEAD OF TWO'S COMPLEMENT NEGATIVE NUMBERS, AND EVERYTHING WILL WORK OUT
  1458. GREAT.
  1459.  
  1460. ╔NCIDENTALLY, FUDGING THIS TABLE PROVIDES AN EASY WAY TO ADD PRETTY COOL
  1461. SPECIAL EFFECTS.  ╘HE INITIALIZATION PROGRAM SETS UP THE MATH TABLE USING THE
  1462. FOLLOWING LINE:
  1463.  
  1464.             [FOR J=0 TO 255]
  1465.         290 ╙=╩:╔╞ ╙>150 ╘╚┼╬ ╙=256-╙
  1466.             [POKE BM+J,╙*╙]
  1467.  
  1468. ╘RY CHANGING THE INEQUALITY FROM ╙>150 TO ╙>120 (OR ╙>127, WHERE IT WOULD BE
  1469. FOR A TWO'S COMPLEMENT TABLE), AND SEE WHAT HAPPENS!
  1470.  
  1471. ┴ND THIS IS WHY WE CAN'T STORE D/(Z0-Z) IN THE POINTERS ┌╨1 AND ┌╨2 -- IF WE
  1472. DID, THEN FOR A GIVEN MULTIPLICATION WE COULD GET NUMBERS LARGER THAN 127 AND
  1473. SMALLER THAN -128, AND OUR CLEVER TABLE WOULD NO LONGER WORK RIGHT.  ╫E CAN
  1474. STILL GET AROUND THIS -- ALL WE NEED IS TWO CLEVER TABLES, ONE FOR THE
  1475. POSITIVE D/(Z0-Z) AND ONE FOR NEGATIVE D/(Z0-Z).  ╞OR THE FIRST TABLE, WE
  1476. HAVE THE SITUATION OUTLINED ABOVE: NO NUMBERS SMALLER THAN -90 OR SO, AND
  1477. NUMBERS POSSIBLE LARGER THAN 127.  ╞OR THE SECOND TABLE WE HAVE THE REVERSE
  1478. SITUATION: NO NUMBERS LARGER THAN 90 OR SO, BUT POSSIBLE NUMBERS LESS THAN
  1479. -128. ╙INCE WE ARE USING TWO POINTERS ANYWAYS (┌╨1 AND ┌╨2), THIS IS NOT
  1480. DIFFICULT TO IMPLEMENT.
  1481.  
  1482. ╘HE END RESULT IS THAT YOU CAN DO THE ENTIRE PROJECTION IN AROUND 36 CYCLES
  1483. IF YOU SO DESIRE.  36 CYCLES?  ╬OTE THAT FOR THE SECOND TABLE THE CODE DOES
  1484. SOMETHING LIKE ┼╧╥ #$╞╞; ├╠├; ┴─├ #$01. ╫ELL, IF WE SET UP THE SECOND TABLE
  1485. AS F(X)=(X+1)^2/4 THEN WE HAVE INCLUDED THE ├╠├ AND ┴─├ #$01 INTO THE TABLE,
  1486. SO THE INSTRUCTIONS CAN BE REMOVED.  ╘HE ENTIRE PROJECTION ROUTINE IS THEN:
  1487.  
  1488.         ... (ROTATE Z)
  1489.         ╙╘┴ ┌╨1
  1490.         ┼╧╥ #$╞╞
  1491.         ╙╘┴ ┌╨2
  1492.         ... (ROTATE X)
  1493.         ╘┴┘
  1494.         ╠─┴ (┌╨1),┘
  1495.         ╙┼├
  1496.         ╙┬├ (┌╨2),┘    ;╬OW ┴ CONTAINS PROJECTED ╪
  1497.         ... (ROTATE Y)
  1498.         ╘┴┘
  1499.         ╠─┴ (┌╨1),┘
  1500.         ╙┼├
  1501.         ╙┬├ (┌╨2),┘
  1502.  
  1503. ╠OOKS LIKE 36-40 CYCLES TO ME!  ╘HE PROGRAM DOESN'T IMPLEMENT THIS -- IT ONLY
  1504. USES A SINGLE TABLE, AND REPEATS THE ╙╘┴ ┌╨1 STUFF AT EACH STEP.  ┴ FEW
  1505. CYCLES WASTED WON'T KILL US (THERE ARE PLENTY OF CYCLES WASTED IN THE CODE),
  1506. AND IT IS PROBABLY TRICKY ENOUGH TO FOLLOW AS IT IS.
  1507.  
  1508. ┘OU MIGHT BE ASKING, WHAT IS THE TRUE MINIMUM VALUE FOR A GIVEN Z0 AND D?
  1509. ╫ELL, ╔ TRIED WRITING DOWN A SET OF EQUATIONS AND MINIMIZING ACCORDING TO
  1510. SOME CONSTRAINTS, AND ╔ ENDED UP WITH A SIXTH-ORDER POLYNOMIAL WHICH ╔ HAD TO
  1511. WRITE LITTLE NEWTON-ITERATION SOLVER FOR.  ╔N OTHER WORDS, ╔ DON'T THINK YOU
  1512. CAN WRITE DOWN A SIMPLE FUNCTION OF D AND Z0 TO GIVE THE TABLE BOUNDARIES.  ╔
  1513. FOUND 150 TO BE A PERFECTLY REASONABLE NUMBER TO USE.
  1514.  
  1515. ╔NCIDENTALLY, THIS IS WHY THE PROJECTION WAS NOT CHANGED TO Z=Z+C -- ╔ DIDN'T
  1516. WANT TO GO FIDDLING AROUND WITH IT AGAIN.  ═AYBE NEXT TIME :).
  1517.  
  1518. ╧╬┼ ═╧╥┼ ╘╚╔╬╟!!!  ╘HIS IS VERY IMPORTANT.  ╘HE MATH TABLE ═╒╙╘ BE ON AN EVEN
  1519. BOUNDARY FOR THE ABOVE ALGORITHM TO WORK CORRECTLY.  ╘HIS ONE IS EASY TO GET
  1520. BIT BY.
  1521.  
  1522. ╠OGARITHMIC ═ULTIPLICATION
  1523. --------------------------
  1524.  
  1525. ┴S LONG AS WE'RE TALKING ABOUT FAST MULTIPLICATION HERE, IT IS WORTHWHILE TO
  1526. MENTION ANOTHER METHOD FOR MULTIPLYING TWO NUMBERS TOGETHER.  ╘O UNDERSTAND
  1527. IT YOU NEED TO UNDERSTAND TWO IMPORTANT PROPERTIES OF LOGARITHMS:
  1528.  
  1529.         LOG(X*Y) = LOG(X) + LOG(Y)
  1530.         LOG_B(X) = Y  <=>  B^Y = X
  1531.  
  1532. ╘HESE ARE A REFLECTION OF THE FACT THAT LOGARITHMS ARE INVERSES OF
  1533. EXPONENTIATION.  ╙O YOU CAN SEE THAT ANOTHER WAY TO MULTIPLY TWO NUMBERS
  1534. TOGETHER IS TO TAKE THEIR LOGS, ADD, AND THEN EXPONENTIATE THE RESULT.  ╙O
  1535. YOU COULD HAVE A TABLE OF LOG_2 (BASE 2 LOGARITHMS) AND ANOTHER TABLE OF 2^X,
  1536. AND DO A MULTIPLICATION VERY QUICKLY. (┴CTUALLY, YOU'D WANT A TABLE OF
  1537. 32*LOG_2(X), SINCE LOG_2(256)=8). ╫HY WASN'T THIS METHOD USED?
  1538.  
  1539. ╞IRST, DEALING WITH SIGNED NUMBERS IS MUCH TRICKIER -- THE LOGARITHM OF A
  1540. NEGATIVE NUMBER IS A COMPLEX (I.E. REAL+IMAGINARY) NUMBER, COMPLETE WITH
  1541. BRANCH CUTS.  ┘OU CAN GET AROUND THIS BY SETTING UP THE TABLES IN A SPECIAL
  1542. WAY (FOR INSTANCE BY LETTING LOG(-X)=-LOG(X)) AND PUTTING IN SOME SPECIAL
  1543. HANDLING, BUT IT ISN'T AS EFFICIENT AS THE ALGORITHM USED IN THE PROGRAM.
  1544.  
  1545. ╙ECOND, ACCURACY DECREASES SIGNIFICANTLY AS X AND Y GET LARGE, SO THAT FOR AN
  1546. EIGHT-BIT TABLE OF LOGARITHMS YOU WILL OFTEN GET AN ANSWER THAT IS OFF BY ONE
  1547. OR MORE.  ┘OU CAN IN FACT GET AROUND THIS PROBLEM BY USING SOME SNEAKY
  1548. MANIPULATION -- IF YOU ARE INTERESTED IN SEEING THIS, CONTACT US!
  1549.  
  1550. ┬UT IT IS WORTHWHILE TO KEEP THIS METHOD IN MIND IF YOU NEED A REALLY FAST
  1551. MULTIPLICATION AND YOU AREN'T TOO WORRIED ABOUT ACCURACY.
  1552.  
  1553. ├HRISTOPHER ╩AM (PHILLIPS@EE.UWA.EDU.AU) HAS COME UP WITH AN INTERESTING
  1554. VARIATION ON THIS METHOD.  ╔T CALCULATES 64+64*X/Z AND USES A SLIGHTLY
  1555. DIFFERENT STRUCTURE FOR THE SIGNED NUMBERS, AND RUNS ALMOST AS FAST AS THE
  1556. METHOD USED BY THE PROGRAM -- CONTACT HIM FOR MORE INFORMATION IF YOU'RE
  1557. INTERESTED.
  1558.  
  1559.  
  1560. ╚IDDEN ╙URFACES
  1561. ---------------
  1562.  
  1563. ╘HE REMAINDER OF THIS FOLLOWS RIGHT FROM THE DISCUSSION SECTION. ╔N THE
  1564. PROGRAM THE CUBE VERTICES ARE LABELED AS
  1565.  
  1566.         ╨1 = 1,1,1
  1567.         ╨2 = 1,-1,1
  1568.         ╨3 = -1,-1,1
  1569.         ╨4 = -1,1,1
  1570.         ╨5 = 1,1,-1
  1571.         ╨6 = 1,-1,-1
  1572.         ╨7 = -1,-1,-1
  1573.         ╨8 = -1,1,-1
  1574.  
  1575. AND THE FACES ARE CHOSEN TO BE
  1576.  
  1577.         ╞ACE 1: ╨1 ╨2 ╨3 ╨4
  1578.              6: ╨5 ╨6 ╨7 ╨8
  1579.         ╞ACE 2: ╨1 ╨2 ╨5 ╨6
  1580.              5: ╨3 ╨4 ╨7 ╨8
  1581.         ╞ACE 3: ╨1 ╨4 ╨8 ╨5
  1582.              4: ╨2 ╨3 ╨6 ╨7
  1583.  
  1584. (THINK OF IT AS A SIX-SIDED DICE, WITH SIX OPPOSITE OF ONE, ETC.).  ╘HE NORMAL
  1585. VECTORS ARE THEN
  1586.  
  1587.         ╞ACE 1: ╨1-╨5
  1588.         ╞ACE 2: ╨1-╨4
  1589.         ╞ACE 3: ╨1-╨2
  1590.  
  1591. ╘HIS MEANS THAT WE NEED TO STORE THE Z-COORDINATES FOR POINTS 1,2,4, AND 5.
  1592. ╬OTE THAT THE OPPOSITE FACES HAVE EXACTLY OPPOSITE NORMAL VECTORS, SO THAT
  1593. FOR INSTANCE THE NORMAL VECTOR FOR FACE 6 IS ╨5-╨1, THE NEGATIVE OF FACE 1.
  1594.  
  1595. ╚ERE IS SOMETHING TO CONSIDER: WHEN ONE FACE IS VISIBLE, THE OPPOSITE FACE
  1596. CANNOT BE VISIBLE!  ┬ECAUSE OF THE WAY PROJECTIONS WORK, THOUGH, THE CONVERSE
  1597. IS NOT TRUE; IT IS ENTIRELY POSSIBLE TO HAVE TWO OPPOSITE FACES INVISIBLE.
  1598. ╘O PROVE THIS TO YOURSELF JUST LOOK AT YOUR FAVORITE BOX, LIKE YOUR MONITOR,
  1599. STRAIGHT-ON, AND NOTICE THAT YOU CAN'T SEE THE SIDES!
  1600.  
  1601. ┴LL THAT THE PROGRAM DOES IS SUBTRACT Z-COORDINATES AND ADD THEM TO THE
  1602. CONSTANT ╦, AND CHECK THE SIGN.  ╒NFORTUNATELY WE CAN HAVE A POSITIVE
  1603. OVERFLOW WHILE ADDING STUFF TOGETHER (SINCE THESE ARE SIGNED NUMBERS), AND IF
  1604. WE DON'T CATCH THE POSITIVE OVERFLOW WE WILL CALCULATE A NEGATIVE RESULT WHEN
  1605. THE RESULT IS ACTUALLY POSITIVE!  ╘HIS WILL OF COURSE WRECK THE HIDDEN
  1606. SURFACE REMOVAL.
  1607.  
  1608.  
  1609. ╞ILLED ╞ACES
  1610. ------------
  1611.  
  1612. ╘HE PROGRAM CURRENTLY USES THE FIRST ALGORITHM TO FILL FACES, I.E. THE
  1613. COOKIE-CUTTER ELEPHANT-CARVING METHOD.  ─URING THE PROJECTIONS THE PROGRAM
  1614. CHECKS EACH VALUE OF Y TO FIND THE MINIMUM AND MAXIMUM VALUES FOR THIS PLOT,
  1615. YMIN AND YMAX.  ╘HE PROGRAM THEN CLEARS THE BUFFER UP TO AND INCLUDING YMIN,
  1616. FILLS THE BUFFER FROM YMIN+1 TO YMAX-1, AND THEN CLEARS THE REST OF THE
  1617. BUFFER.  ╫HY DOES IT CLEAR YMIN AND YMAX?  ┬ECAUSE THE ONLY THING THAT CAN
  1618. HAPPEN ON THOSE LINES IS AN EDGE -- THERE IS NO POINT IN FILLING THESE LINES
  1619. AND THEN CLEARING THEM, SINCE THEY WILL ALWAYS BE CLEAR.  ┬Y ONLY FILLING THE
  1620. BUFFER BETWEEN YMIN AND YMAX, WE SAVE SOME TIME IN REMOVING THE JUNK FROM THE
  1621. EDGES OF THE CUBE.
  1622.  
  1623. ╬EXT, THE CUBE IS DRAWN.  ╘HE BACKGROUND IS BLACK AND THE FACES ARE WHITE,
  1624. I.E. OUR FILL COLOR IS WHITE.  ├LEARLY THEN WE WANT TO DRAW OUR LINES IN
  1625. BLACK.  ╔ COULD HAVE REVERSED BACKGROUND AND FOREGROUND COLORS AND LEFT THE
  1626. LINE ROUTINE AS-IS, BUT OF COURSE BEING THE LAZY PROGRAMMER ╔ AM ╔ DECIDED
  1627. INSTEAD TO CHANGE THE TABLE ┬╔╘╨.  ┘OU MAY RECALL THAT THE EARLIER TABLE HAD
  1628. ENTRIES LIKE %10000000 %01000000 ETC. ╬OW IT HAS ENTRIES LIKE %01111111
  1629. %10111111 ETC., AND INSTEAD OF ╧╥┴ING THE VALUES INTO THE BUFFER, THEY ARE
  1630. ┴╬─ED INTO THE BUFFER.  ╘HIS THEN DRAWS LINES OF ZEROES INTO OUR BUFFER WHICH
  1631. IS SOLID ONES.
  1632.  
  1633. ╞INALLY, TO UN-FILL THE OUTSIDE OF THE CUBE THE PROGRAM SIMPLY GOES THROUGH
  1634. THE BUFFER FROM YMIN TO YMAX, COLORING EVERYTHING BLACK UNTIL IT HITS A ZERO,
  1635. I.E. AN EDGE.  ┴T THIS POINT IT CALCULATES THE APPROPRIATE PATTERN TO CLEAR
  1636. UP TO THE EDGE, AND THEN DOES THE SAME THING STARTING FROM THE RIGHT HAND
  1637. SIDE OF THE BUFFER.  ╔N OTHER WORDS IT RUNS ALONG A SPECIFIC Y-VALUE COLORING
  1638. EVERYTHING BLACK UNTIL IT HITS THE EDGE OF THE CUBE, AND DOES THIS FOR ALL
  1639. THE RELEVANT Y-VALUES.
  1640.  
  1641.  
  1642. ╘EXTURE ═APPING
  1643. ---------------
  1644.  
  1645. ═ORE OF A FILL-PATTERN REALLY.  ╘HE PROGRAM CUBE3D2.1.O DOES ALL OF THE ABOVE
  1646. BUT IN MULTICOLOR MODE.  ╬OW INSTEAD OF USING A SOLID COLOR TO FILL THE
  1647. BUFFER THE PROGRAM USES A SERIES OF COLORED LINES -- REALLY A VERY SIMPLE
  1648. PATTERN.  ┴ MUCH NEATER THING WOULD BE TO HAVE A PATTERN DRAWN OUT IN A
  1649. PATTERN BUFFER, AND TO COPY THAT INTO THE DRAWING BUFFER.  ╧THER THINGS TO
  1650. TRY ARE COLORED SQUARES WHICH SHIFT AROUND.  CUBE3D2.1.O IS JUST A REALLY
  1651. QUICK HACK, BUT AT LEAST IT DEMONSTRATES THE CONCEPT.
  1652.  
  1653. ═┴╦┼ ╙╒╥┼ THAT YOU CHANGE THE VALUE OF ─ FROM 170 TO 85 IF YOU TRY THIS
  1654. PROGRAM!  ╨IXELS ARE DOUBLED NOW, SO THAT RESOLUTION IS CUT IN HALF.  ╘HIS IS
  1655. LOCATED AT LINE 240 IN ╔╬╔╘3─2.0
  1656.  
  1657.  
  1658. ═EMORY ═AP
  1659. ----------
  1660.  
  1661. ╘HE MAIN PROGRAM IS LOCATED AT $8000=32768 AND IS 3200 BYTES LONG.
  1662.  
  1663.         $8000-$8├00     - ╨ROGRAM
  1664.         $8├00-$8├80     - ┬IT POSITION TABLE
  1665.         $8├80-$8─00     - ╘ABLE OF SINES
  1666.         $8─00-$8─80     - ╘ABLE OF COSINES.
  1667.         $8─80-$8┼80     - ╘ABLE OF D/(Z0-Z/64)
  1668.         $8╞00-$9100     - ╘WO 256-BYTE TABLES OF G(X)=X*X/256
  1669.  
  1670.         $3000           - ╞IRST DRAWING BUFFER
  1671.         $3800           - ╙ECOND DRAWING BUFFER
  1672.  
  1673. ╔╬╔╘3─ IS A SIMPLE BASIC PROGRAM TO SET UP THE TABLES.  ╞OR ╔╬╔╘3─2.X THE
  1674. IMPORTANT SETUP ROUTINES ARE:
  1675.  
  1676.         LINES 100-150   - ╙ET UP THE TRIGONOMETRIC TABLES
  1677.         LINES 233-310   - ╙ET UP THE PROJECTION AND MULT TABLES
  1678.                 240     - ╠OCATION OF CONSTANTS ─ AND ┌0
  1679.                 290     - ╙ET TABLE BOUNDARY FOR MULTIPLICATION
  1680.  
  1681.  
  1682. ╘HAT'S ALL -- UNTIL NEXT TIME...
  1683.  
  1684. ╙TEVE ╩UDD      ╟EORGE ╘AYLOR   12/2/95
  1685.  
  1686. ╘HIS DOCUMENT IS ├OPYRIGHT 1995 BY ╙TEPHEN ╩UDD AND ╟EORGE ╘AYLOR. ═UCH LIKE
  1687. THE PREVIOUS ONE.  ╔T IS ALSO FREELY DISTRIBUTABLE.
  1688.  
  1689. ┴ND HERE IS THE SOURCE CODE:
  1690.  
  1691.  
  1692. ********************************
  1693. *                              *
  1694. * ╙TEPHEN ╩UDD                 *
  1695. * ╟EORGE ╘AYLOR                *
  1696. * ╙TARTED: 7/11/94             *
  1697. * ╞INISHED: 7/19/94            *
  1698. * V2.0 ├OMPLETED: 12/17/94     *
  1699. *                              *
  1700. * ╫ELL, IF ALL GOES WELL THIS  *
  1701. * PROGRAM WILL ROTATE A CUBE.  *
  1702. *                              *
  1703. * V2.0 + ╬EW AND ╔MPROVED!     *
  1704. * ╬OW WITH FASTER ROUTINES,    *
  1705. * HIDDEN SURFACES, FILLED      *
  1706. * FACES, AND EXTRA TOP SECRET  *
  1707. * TEXT MESSAGES!               *
  1708. *                              *
  1709. * ╘HIS PROGRAM IS INTENDED TO  *
  1710. * ACCOMPANY THE ARTICLE IN     *
  1711. * ├=╚ACKING, ╩AN. 95 ISSUE.    *
  1712. * ╞OR DETAILS ON THIS PROGRAM, *
  1713. * READ THE ARTICLE!            *
  1714. *                              *
  1715. * ╫RITE TO US!                 *
  1716. *                              *
  1717. * ═YSELF WHEN YOUNG DID        *
  1718. * EAGERLY FREQUENT             *
  1719. * ─OCTOR AND ╙AINT, AND HEARD  *
  1720. * GREAT ┴RGUMENT               *
  1721. *  ┴BOUT IT AND ABOUT: BUT     *
  1722. *  EVERMORE                    *
  1723. * ├AME OUT BY THE SAME ─OOR    *
  1724. * AS IN ╔ WENT.                *
  1725. *    - ╥UBAIYAT                *
  1726. *                              *
  1727. * ╘HOUGH ╔ SPEAK WITH THE      *
  1728. * TONGUES OF MEN AND OF ANGLES *
  1729. * AND HAVE NOT LOVE, ╔ AM      *
  1730. * BECOME AS SOUNDING BRASS, OR *
  1731. * A TINKLING CYMBAL.           *
  1732. *    - 1 ├ORINTHIANS 13        *
  1733. *                              *
  1734. * ╨.╙. ╘HIS WAS WRITTEN USING  *
  1735. *      ═ERLIN 128.             *
  1736. ********************************
  1737.  
  1738.          ╧╥╟ $8000
  1739.  
  1740. * ├ONSTANTS
  1741.  
  1742. ┬╒╞╞1    ┼╤╒ $3000        ;╞IRST CHARACTER SET
  1743. ┬╒╞╞2    ┼╤╒ $3800        ;╙ECOND CHARACTER SET
  1744. ┬╒╞╞┼╥   ┼╤╒ $┴3          ;╨RESUMABLY THE TAPE WON'T BE RUNNING
  1745. ╪1       ┼╤╒ $╞┬          ;╨OINTS FOR DRAWING A LINE
  1746. ┘1       ┼╤╒ $╞├          ;╘HESE ZERO PAGE ADDRESSES
  1747. ╪2       ┼╤╒ $╞─          ;DON'T CONFLICT WITH ┬┴╙╔├
  1748. ┘2       ┼╤╒ $╞┼
  1749. ─╪       ┼╤╒ $╞9
  1750. ─┘       ┼╤╒ $╞┴
  1751. ╘┼═╨1    ┼╤╒ $╞┬          ;╧F COURSE, COULD CONFLICT WITH X1
  1752. ╘┼═╨2    ┼╤╒ $╞├          ;╘EMPORARY VARIABLES
  1753. ┌╘┼═╨    ┼╤╒ $02          ;╒SED FOR BUFFER SWAP.  ─ON'T TOUCH.
  1754. ┌1       ┼╤╒ $22          ;╒SED BY MATH ROUTINE
  1755. ┌2       ┼╤╒ $24          ;─ON'T TOUCH THESE EITHER!
  1756. ╦        ┼╤╒ $┬6          ;├ONSTANT USED FOR HIDDEN
  1757.                           ;SURFACE DETECTION - DON'T TOUCH
  1758. ╞┴├┼╙    ┼╤╒ $┬5          ;╒SED IN HIDDEN SURFACES.
  1759. ┘═╔╬     ┼╤╒ $╞7          ;╒SED IN FILLED FACES -- AS
  1760. ┘═┴╪     ┼╤╒ $╞8          ;USUAL, DON'T TOUCH
  1761. ┴╬╟═┴╪   ┼╤╒ 120          ;╘HERE ARE 2*PI/ANGMAX ANGLES
  1762.  
  1763. * ╓╔├
  1764.  
  1765. ╓═├╙┬    ┼╤╒ $─018
  1766. ┬╦╟╬─    ┼╤╒ $─020
  1767. ┬╧╥─┼╥   ┼╤╒ $─021
  1768. ╙╙╘┴╥╘   ┼╤╒ 1344         ;ROW 9 IN SCREEN MEMORY AT 1024
  1769.  
  1770.  
  1771. * ╦ERNAL
  1772.  
  1773. ├╚╥╧╒╘   ┼╤╒ $╞╞─2
  1774. ╟┼╘╔╬    ┼╤╒ $╞╞┼4
  1775.  
  1776. * ╙OME VARIABLES
  1777.  
  1778. ╘╪1      = $3╞
  1779. ╘┘1      = $40
  1780. ╘╪2      = $41
  1781. ╘┘2      = $42
  1782. ╨1╪      = $92            ;╘HESE ARE TEMPORARY STORAGE
  1783. ╨1┘      = $93            ;╒SED IN PLOTTING THE PROJECTION
  1784. ╨2╪      = $94
  1785. ╨2┘      = $95            ;╘HEY ARE HERE SO THAT WE
  1786. ╨3╪      = $96            ;DON'T HAVE TO RECALCULATE THEM.
  1787. ╨3┘      = $┴┼
  1788. ╨4╪      = $┴╞            ;╘HEY MAKE LIFE EASY.
  1789. ╨4┘      = $┬0
  1790. ╨5╪      = $┬1            ;╫HY ARE YOU LOOKING AT ME LIKE THAT?
  1791. ╨5┘      = $┬2            ;─ON'T YOU TRUST ME?
  1792. ╨6╪      = $┬3
  1793. ╨6┘      = $┬4            ;╚AVING ANOTHER CHILD WASN'T MY IDEA.
  1794. ╨7╪      = $71
  1795. ╨7┘      = $50
  1796. ╨8╪      = $51
  1797. ╨8┘      = $52
  1798. ╨1┌      = $57            ;╘HESE ARE Z-COORDINATES
  1799. ╨2┌      = $58            ;╫E ONLY NEED THESE FOUR TO CHECK
  1800. ╨4┌      = $59            ;FOR HIDDEN FACES
  1801. ╨5┌      = $60
  1802. ─╙╪      = $61            ;─╙╪ IS THE INCREMENT FOR
  1803.                           ;ROTATING AROUND X
  1804. ─╙┘      = $62            ;╙IMILAR FOR ─╙┘, ─╙┌
  1805. ─╙┌      = $63
  1806. ╙╪       = $64            ;╘HESE ARE THE ACTUAL ANGLES IN X Y AND Z
  1807. ╙┘       = $65
  1808. ╙┌       = $66
  1809. ╘1       = $67            ;╘HESE ARE USED IN THE ROTATION
  1810. ╘2       = $68
  1811. ╘3       = $69            ;╙EE THE ARTICLE FOR MORE DETAILS
  1812. ╘4       = $6┴
  1813. ╘5       = $6┬
  1814. ╘6       = $6├
  1815. ╘7       = $6─
  1816. ╘8       = $6┼
  1817. ╘9       = $6╞
  1818. ╘10      = $70
  1819. ┴11      = $┴5            ;╘HESE ARE THE ELEMENTS OF THE ROTATION MATRIX
  1820. ┬12      = $┴6            ;╪┘┌
  1821. ├13      = $┴7
  1822. ─21      = $┴8            ;╘HE NUMBER DENOTES (ROW,COLUMN)
  1823. ┼22      = $┴9
  1824. ╞23      = $┴┴
  1825. ╟31      = $┴┬
  1826. ╚32      = $┴├
  1827. ╔33      = $┴─
  1828.  
  1829.  
  1830. *** ═ACROS
  1831.  
  1832. ═╧╓┼     ═┴├
  1833.          ╠─┴ ]1
  1834.          ╙╘┴ ]2
  1835.          <<<
  1836.  
  1837. ╟┼╘╦┼┘   ═┴├              ;╫AIT FOR A KEYPRESS
  1838. ╫┴╔╘     ╩╙╥ ╟┼╘╔╬
  1839.          ├═╨ #00
  1840.          ┬┼╤ ╫┴╔╘
  1841.          <<<
  1842.  
  1843. *-------------------------------
  1844.  
  1845.          ╠─┴ #$00
  1846.          ╙╘┴ ┬╦╟╬─
  1847.          ╙╘┴ ┬╧╥─┼╥
  1848.          ╠─┴ ╓═├╙┬
  1849.          ┴╬─ #%00001111   ;╙CREEN MEMORY TO 1024
  1850.          ╧╥┴ #%00010000
  1851.          ╙╘┴ ╓═├╙┬
  1852.  
  1853.          ╠─┘ #00
  1854.          ╠─┴ #<╘╘┼╪╘
  1855.          ╙╘┴ ╘┼═╨1
  1856.          ╠─┴ #>╘╘┼╪╘
  1857.          ╙╘┴ ╘┼═╨2
  1858.          ╩═╨ ╘╔╘╠┼
  1859. ╘╘┼╪╘    ╚┼╪ 9305111111   ;CLEAR SCREEN, WHITE, CRSR DN
  1860.          ╘╪╘ '             CUBE3D V2.0',0D,0D
  1861.          ╘╪╘ '                  BY',0D
  1862.          ╚┼╪ 9╞           ;CYAN
  1863.          ╘╪╘ '    STEPHEN JUDD'
  1864.          ╚┼╪ 99
  1865.          ╘╪╘ '    GEORGE TAYLOR',0D,0D
  1866.          ╚┼╪ 9┬
  1867.          ╘╪╘ '  CHECK OUT THE JAN. 95 ISSUE OF',0D
  1868.          ╚┼╪ 96
  1869.          ╘╪╘ '  C=HACKING'
  1870.          ╚┼╪ 9┬
  1871.          ╘╪╘ ' FOR MORE DETAILS!',0D
  1872.          ╚┼╪ 0─1─1─9┼12
  1873.          ╘╪╘ 'F1/F2',92
  1874.          ╘╪╘ ' - INC/DEC X-ROTATION',0D
  1875.          ╚┼╪ 1─1─12
  1876.          ╘╪╘ 'F3/F4',92
  1877.          ╘╪╘ ' - INC/DEC Y-ROTATION',0D
  1878.          ╚┼╪ 1─1─12
  1879.          ╘╪╘ 'F5/F6',92
  1880.          ╘╪╘ ' - INC/DEC Z-ROTATION',0D
  1881.          ╚┼╪ 1─1─12
  1882.          ╘╪╘ 'F7',92
  1883.          ╘╪╘ ' RESETS',0D
  1884.          ╘╪╘ '  PRESS Q TO QUIT',0D
  1885.          ╚┼╪ 0─05
  1886.          ╘╪╘ '      PRESS ANY KEY TO BEGIN',0D
  1887.          ╚┼╪ 00
  1888. ╘╔╘╠┼    ╠─┴ (╘┼═╨1),┘
  1889.          ┬┼╤ :├╧╬╘
  1890.          ╩╙╥ ├╚╥╧╒╘
  1891.          ╔╬┘
  1892.          ┬╬┼ ╘╔╘╠┼
  1893.          ╔╬├ ╘┼═╨2
  1894.          ╩═╨ ╘╔╘╠┼
  1895.          ╘╪╘ '╘HIS IS A SECRET TEXT MESSAGE!'
  1896. :├╧╬╘    >>> ╟┼╘╦┼┘
  1897.  
  1898. **** ╙ET UP TABLES(?)
  1899.  
  1900. * ╘ABLES ARE CURRENTLY SET UP IN ┬┴╙╔├
  1901. * AND BY THE ASSEMBLER.
  1902.  
  1903. ╘┴┬╠┼╙   ╠─┴ #>╘═┴╘╚
  1904.          ╙╘┴ ┌1+1
  1905.          ╙╘┴ ┌2+1
  1906.  
  1907. **** ├LEAR SCREEN AND SET UP "BITMAP"
  1908. ╙┼╘╒╨    ╠─┴ #$01         ;╫HITE
  1909.          ╙╘┴ $─021        ;╘HIS IS DONE SO THAT OLDER
  1910.          ╠─┴ #147         ;MACHINES WILL SET UP
  1911.          ╩╙╥ ├╚╥╧╒╘
  1912.          ╠─┴ #$00         ;CORRECTLY
  1913.          ╙╘┴ $─021
  1914.          ╠─┴ #<╙╙╘┴╥╘
  1915.          ┴─├ #12          ;╘HE GOAL IS TO CENTER THE GRAPHICS
  1916.          ╙╘┴ ╘┼═╨1        ;├OLUMN 12
  1917.          ╠─┴ #>╙╙╘┴╥╘     ;╥OW 9
  1918.          ╙╘┴ ╘┼═╨1+1      ;╙╙╘┴╥╘ POINTS TO ROW 9
  1919.          ╠─┴ #00
  1920.          ╠─┘ #00
  1921.          ╠─╪ #00          ;X WILL COUNT 16 ROWS FOR US
  1922.          ├╠├
  1923.  
  1924. :╠╧╧╨    ╙╘┴ (╘┼═╨1),┘
  1925.          ╔╬┘
  1926.          ┴─├ #16
  1927.          ┬├├ :╠╧╧╨
  1928.          ├╠├
  1929.          ╠─┴ ╘┼═╨1
  1930.          ┴─├ #40          ;╬EED TO ADD 40 TO THE BASE POINTER
  1931.          ╙╘┴ ╘┼═╨1        ;╘O JUMP TO THE NEXT ROW
  1932.          ╠─┴ ╘┼═╨1+1
  1933.          ┴─├ #00          ;╘AKE CARE OF CARRIES
  1934.          ╙╘┴ ╘┼═╨1+1
  1935.          ╠─┘ #00
  1936.          ╔╬╪
  1937.          ╘╪┴              ;╪ IS ALSO AN INDEX INTO THE CHARACTER NUMBER
  1938.          ├╨╪ #16
  1939.          ┬╬┼ :╠╧╧╨        ;╬EED TO DO IT 16 TIMES
  1940.  
  1941. **** ╙ET UP BUFFERS
  1942.  
  1943.          ╠─┴ #<┬╒╞╞1
  1944.          ╙╘┴ ┬╒╞╞┼╥
  1945.          ╠─┴ #>┬╒╞╞1
  1946.          ╙╘┴ ┬╒╞╞┼╥+1
  1947.          ╙╘┴ ┌╘┼═╨        ;ZTEMP WILL MAKE LIFE SIMPLE FOR US
  1948.          ╠─┴ ╓═├╙┬
  1949.          ┴╬─ #%11110001   ;╙TART HERE SO THAT SWAP BUFFERS WILL WORK RIGHT
  1950.          ╧╥┴ #%00001110
  1951.          ╙╘┴ ╓═├╙┬
  1952.  
  1953. **** ╙ET UP INITIAL VALUES
  1954.  
  1955. ╔╬╔╘     ╠─┴ #00
  1956.          ╙╘┴ ─╙╪
  1957.          ╙╘┴ ─╙┘
  1958.          ╙╘┴ ─╙┌
  1959.          ╙╘┴ ╙╪
  1960.          ╙╘┴ ╙┘
  1961.          ╙╘┴ ╙┌
  1962.  
  1963. *-------------------------------
  1964. * ═AIN LOOP
  1965.  
  1966. **** ╟ET KEYPRESS
  1967.  
  1968. ═┴╔╬
  1969.          ├╠╔
  1970. ╦╨╥┼╙╙   ╩╙╥ ╟┼╘╔╬
  1971.          ├═╨ #133         ;╞1?
  1972.          ┬╬┼ :╞2
  1973.          ╠─┴ ─╙╪
  1974.          ├═╨ #┴╬╟═┴╪/2    ;╬O MORE THAN PI
  1975.          ┬┼╤ :├╧╬╘
  1976.          ╔╬├ ─╙╪          ;OTHERWISE INCREASE X-ROTATION
  1977.          ╩═╨ :├╧╬╘
  1978. :╞2      ├═╨ #137         ;╞2?
  1979.          ┬╬┼ :╞3
  1980.          ╠─┴ ─╙╪
  1981.          ┬┼╤ :├╧╬╘
  1982.          ─┼├ ─╙╪
  1983.          ╩═╨ :├╧╬╘
  1984. :╞3      ├═╨ #134
  1985.          ┬╬┼ :╞4
  1986.          ╠─┴ ─╙┘
  1987.          ├═╨ #┴╬╟═┴╪/2
  1988.          ┬┼╤ :├╧╬╘
  1989.          ╔╬├ ─╙┘          ;╔NCREASE Y-ROTATION
  1990.          ╩═╨ :├╧╬╘
  1991. :╞4      ├═╨ #138
  1992.          ┬╬┼ :╞5
  1993.          ╠─┴ ─╙┘
  1994.          ┬┼╤ :├╧╬╘
  1995.          ─┼├ ─╙┘
  1996.          ╩═╨ :├╧╬╘
  1997. :╞5      ├═╨ #135
  1998.          ┬╬┼ :╞6
  1999.          ╠─┴ ─╙┌
  2000.          ├═╨ #┴╬╟═┴╪/2
  2001.          ┬┼╤ :├╧╬╘
  2002.          ╔╬├ ─╙┌          ;Z-ROTATION
  2003.          ╩═╨ :├╧╬╘
  2004. :╞6      ├═╨ #139
  2005.          ┬╬┼ :╞7
  2006.          ╠─┴ ─╙┌
  2007.          ┬┼╤ :├╧╬╘
  2008.          ─┼├ ─╙┌
  2009.          ╩═╨ :├╧╬╘
  2010. :╞7      ├═╨ #136
  2011.          ┬╬┼ :╤
  2012.          ╩═╨ ╔╬╔╘
  2013. :╤       ├═╨ #'Q'         ;Q QUITS
  2014.          ┬╬┼ :├╧╬╘
  2015.          ╩═╨ ├╠┼┴╬╒╨
  2016.  
  2017. :├╧╬╘    ╙┼╔              ;╙PEED THINGS UP A BIT
  2018.  
  2019. **** ╒PDATE ANGLES
  2020.  
  2021. ╒╨─┴╘┼   ├╠├
  2022.          ╠─┴ ╙╪
  2023.          ┴─├ ─╙╪
  2024.          ├═╨ #┴╬╟═┴╪      ;┴RE WE >= MAXIMUM ANGLE?
  2025.          ┬├├ :├╧╬╘1
  2026.          ╙┬├ #┴╬╟═┴╪ :╔F SO, RESET
  2027. :├╧╬╘1   ╙╘┴ ╙╪
  2028.          ├╠├
  2029.          ╠─┴ ╙┘
  2030.          ┴─├ ─╙┘
  2031.          ├═╨ #┴╬╟═┴╪
  2032.          ┬├├ :├╧╬╘2
  2033.          ╙┬├ #┴╬╟═┴╪      ;╙AME DEAL
  2034. :├╧╬╘2   ╙╘┴ ╙┘
  2035.          ├╠├
  2036.          ╠─┴ ╙┌
  2037.          ┴─├ ─╙┌
  2038.          ├═╨ #┴╬╟═┴╪
  2039.          ┬├├ :├╧╬╘3
  2040.          ╙┬├ #┴╬╟═┴╪
  2041. :├╧╬╘3   ╙╘┴ ╙┌
  2042.  
  2043. **** ╥OTATE COORDINATES
  2044.  
  2045. ╥╧╘┴╘┼
  2046.  
  2047. *** ╞IRST, CALCULATE T1,T2,...,T10
  2048.  
  2049. ** ╘WO MACROS TO SIMPLIFY OUR LIFE
  2050. ┴──┴     ═┴├              ;┴DD TWO ANGLES TOGETHER
  2051.          ├╠├
  2052.          ╠─┴ ]1
  2053.          ┴─├ ]2
  2054. * ╒SE TWO TRIG TABLES TO REMOVE THE BELOW ├═╨ ETC. CODE
  2055.          ├═╨ #┴╬╟═┴╪      ;╔S THE SUM > 2*PI?
  2056.          ┬├├ ─╧╬┼
  2057.          ╙┬├ #┴╬╟═┴╪      ;╔F SO, SUBTRACT 2*PI
  2058. ─╧╬┼     <<<
  2059.  
  2060. ╙╒┬┴     ═┴├              ;╙UBTRACT TWO ANGLES
  2061.          ╙┼├
  2062.          ╠─┴ ]1
  2063.          ╙┬├ ]2
  2064.          ┬├╙ ─╧╬┼
  2065.          ┴─├ #┴╬╟═┴╪      ;╧OPS, WE NEED TO ADD 2*PI
  2066. ─╧╬┼     <<<
  2067.  
  2068. ** ╬OW CALCULATE T1,T2,ETC.
  2069.  
  2070.          >>> ╙╒┬┴,╙┘      ;╙┌
  2071.          ╙╘┴ ╘1           ;T1=SY-SZ
  2072.          >>> ┴──┴,╙┘      ;╙┌
  2073.          ╙╘┴ ╘2           ;T2=SY+SZ
  2074.          >>> ┴──┴,╙╪      ;╙┌
  2075.          ╙╘┴ ╘3           ;T3=SX+SZ
  2076.          >>> ╙╒┬┴,╙╪      ;╙┌
  2077.          ╙╘┴ ╘4           ;T4=SX-SZ
  2078.          >>> ┴──┴,╙╪      ;╘2
  2079.          ╙╘┴ ╘5           ;T5=SX+T2
  2080.          >>> ╙╒┬┴,╙╪      ;╘1
  2081.          ╙╘┴ ╘6           ;T6=SX-T1
  2082.          >>> ┴──┴,╙╪      ;╘1
  2083.          ╙╘┴ ╘7           ;T7=SX+T1
  2084.          >>> ╙╒┬┴,╘2      ;╙╪
  2085.          ╙╘┴ ╘8           ;T8=T2-SX
  2086.          >>> ╙╒┬┴,╙┘      ;╙╪
  2087.          ╙╘┴ ╘9           ;T9=SY-SX
  2088.          >>> ┴──┴,╙╪      ;╙┘
  2089.          ╙╘┴ ╘10          ;T10=SX+SY
  2090.  
  2091. * ┼T VOILA!
  2092.  
  2093. *** ╬EXT, CALCULATE ┴,┬,├,...,╔
  2094.  
  2095. ** ┴NOTHER USEFUL LITTLE MACRO
  2096. ─╔╓2     ═┴├              ;─IVIDE A SIGNED NUMBER BY 2
  2097.                           ;╔T IS ASSUMED THAT THE NUMBER
  2098.          ┬╨╠ ╨╧╙          ;IS IN THE ACCUMULATOR
  2099.          ├╠├
  2100.          ┼╧╥ #$╞╞         ;╫E NEED TO UN-NEGATIVE THE NUMBER
  2101.          ┴─├ #01          ;BY TAKING IT'S COMPLEMENT
  2102.          ╠╙╥              ;DIVIDE BY TWO
  2103.          ├╠├
  2104.          ┼╧╥ #$╞╞
  2105.          ┴─├ #01          ;═AKE IT NEGATIVE AGAIN
  2106.          ╩═╨ ─╧╬┼─╔╓
  2107. ╨╧╙      ╠╙╥              ;╬UMBER IS POSITIVE
  2108. ─╧╬┼─╔╓  <<<
  2109.  
  2110. ═╒╠2     ═┴├              ;═ULTIPLY A SIGNED NUMBER BY 2
  2111.          ┬╨╠ ╨╧╙═
  2112.          ├╠├
  2113.          ┼╧╥ #$╞╞
  2114.          ┴─├ #$01
  2115.          ┴╙╠
  2116.          ├╠├
  2117.          ┼╧╥ #$╞╞
  2118.          ┴─├ #$01
  2119.          ╩═╨ ─╧╬┼═╒╠
  2120. ╨╧╙═     ┴╙╠
  2121. ─╧╬┼═╒╠  <<<
  2122.  
  2123. ** ╬OTE THAT WE ARE CURRENTLY MAKING A MINOR LEAP
  2124. ** OF FAITH THAT NO OVERFLOWS WILL OCCUR.
  2125.  
  2126. :├┴╠├┴   ├╠├
  2127.          ╠─╪ ╘1
  2128.          ╠─┴ ├╧╙,╪
  2129.          ╠─╪ ╘2
  2130.          ┴─├ ├╧╙,╪
  2131.          ╙╘┴ ┴11          ;┴=(COS(T1)+COS(T2))/2
  2132. :├┴╠├┬   ╠─╪ ╘1
  2133.          ╠─┴ ╙╔╬,╪
  2134.          ╙┼├
  2135.          ╠─╪ ╘2
  2136.          ╙┬├ ╙╔╬,╪
  2137.          ╙╘┴ ┬12          ;┬=(SIN(T1)-SIN(T2))/2
  2138. :├┴╠├├   ╠─╪ ╙┘
  2139.          ╠─┴ ╙╔╬,╪
  2140.          >>> ═╒╠2
  2141.          ╙╘┴ ├13          ;├=SIN(SY)
  2142. :├┴╠├─   ╙┼├
  2143.          ╠─╪ ╘8
  2144.          ╠─┴ ├╧╙,╪
  2145.          ╠─╪ ╘7
  2146.          ╙┬├ ├╧╙,╪
  2147.          ╙┼├
  2148.          ╠─╪ ╘5
  2149.          ╙┬├ ├╧╙,╪
  2150.          ├╠├
  2151.          ╠─╪ ╘6
  2152.          ┴─├ ├╧╙,╪        ;─I=(COS(T8)-COS(T7)+COS(T6)-COS(T5))/2
  2153.          >>> ─╔╓2
  2154.          ├╠├
  2155.          ╠─╪ ╘3
  2156.          ┴─├ ╙╔╬,╪
  2157.          ╙┼├
  2158.          ╠─╪ ╘4
  2159.          ╙┬├ ╙╔╬,╪
  2160.          ╙╘┴ ─21          ;─=(SIN(T3)-SIN(T4)+─I)/2
  2161. :├┴╠├┼   ╙┼├
  2162.          ╠─╪ ╘5
  2163.          ╠─┴ ╙╔╬,╪
  2164.          ╠─╪ ╘6
  2165.          ╙┬├ ╙╔╬,╪
  2166.          ╙┼├
  2167.          ╠─╪ ╘7
  2168.          ╙┬├ ╙╔╬,╪
  2169.          ╙┼├
  2170.          ╠─╪ ╘8
  2171.          ╙┬├ ╙╔╬,╪        ;┼I=(SIN(T5)-SIN(T6)-SIN(T7)-SIN(T8))/2
  2172.          >>> ─╔╓2
  2173.          ├╠├
  2174.          ╠─╪ ╘3
  2175.          ┴─├ ├╧╙,╪
  2176.          ├╠├
  2177.          ╠─╪ ╘4
  2178.          ┴─├ ├╧╙,╪
  2179.          ╙╘┴ ┼22          ;┼=(COS(T3)+COS(T4)+┼I)/2
  2180. :├┴╠├╞   ╠─╪ ╘9
  2181.          ╠─┴ ╙╔╬,╪
  2182.          ╙┼├
  2183.          ╠─╪ ╘10
  2184.          ╙┬├ ╙╔╬,╪
  2185.          ╙╘┴ ╞23          ;╞=(SIN(T9)-SIN(T10))/2
  2186. :├┴╠├╟   ╠─╪ ╘6
  2187.          ╠─┴ ╙╔╬,╪
  2188.          ╙┼├
  2189.          ╠─╪ ╘8
  2190.          ╙┬├ ╙╔╬,╪
  2191.          ╙┼├
  2192.          ╠─╪ ╘7
  2193.          ╙┬├ ╙╔╬,╪
  2194.          ╙┼├
  2195.          ╠─╪ ╘5
  2196.          ╙┬├ ╙╔╬,╪        ;╟I=(SIN(T6)-SIN(T8)-SIN(T7)-SIN(T5))/2
  2197.          >>> ─╔╓2
  2198.          ├╠├
  2199.          ╠─╪ ╘4
  2200.          ┴─├ ├╧╙,╪
  2201.          ╙┼├
  2202.          ╠─╪ ╘3
  2203.          ╙┬├ ├╧╙,╪
  2204.          ╙╘┴ ╟31          ;╟=(COS(T4)-COS(T3)+╟I)/2
  2205. :├┴╠├╚   ├╠├
  2206.          ╠─╪ ╘6
  2207.          ╠─┴ ├╧╙,╪
  2208.          ╠─╪ ╘7
  2209.          ┴─├ ├╧╙,╪
  2210.          ╙┼├
  2211.          ╠─╪ ╘5
  2212.          ╙┬├ ├╧╙,╪
  2213.          ╙┼├
  2214.          ╠─╪ ╘8
  2215.          ╙┬├ ├╧╙,╪        ;╚I=(COS(T6)+COS(T7)-COS(T5)-COS(T8))/2
  2216.          >>> ─╔╓2
  2217.          ├╠├
  2218.          ╠─╪ ╘3
  2219.          ┴─├ ╙╔╬,╪
  2220.          ├╠├
  2221.          ╠─╪ ╘4
  2222.          ┴─├ ╙╔╬,╪
  2223.          ╙╘┴ ╚32          ;╚=(SIN(T3)+SIN(T4)+╚I)/2
  2224. :╫╚┼╫    ├╠├
  2225.          ╠─╪ ╘9
  2226.          ╠─┴ ├╧╙,╪
  2227.          ╠─╪ ╘10
  2228.          ┴─├ ├╧╙,╪
  2229.          ╙╘┴ ╔33          ;╔=(COS(T9)+COS(T10))/2
  2230.  
  2231. ** ╔T'S ALL DOWNHILL FROM HERE.
  2232.          ╩═╨ ─╧╫╬╚╔╠╠
  2233.          ╘╪╘ '╟EE ┬RAIN, WHAT DO YOU WANT TO DO '
  2234.          ╘╪╘ 'TONIGHT?'
  2235.  
  2236. ** ╥OTATE, PROJECT, AND STORE THE POINTS
  2237. ─╧╫╬╚╔╠╠
  2238.  
  2239. * ┴ NEAT MACRO
  2240. ╬┼╟      ═┴├              ;├HANGE THE SIGN OF A TWO'S COMPLEMENT
  2241.          ├╠├
  2242.          ╠─┴ ]1           ;NUMBER.
  2243.          ┼╧╥ #$╞╞
  2244.          ┴─├ #$01
  2245.          <<<
  2246.  
  2247. *-------------------------------
  2248. * ╘HESE MACROS REPLACE THE PREVIOUS PROJECTION
  2249. * SUBROUTINE.
  2250.  
  2251. ╙═╒╠╘    ═┴├              ;═ULTIPLY TWO SIGNED 8-BIT
  2252.                           ;NUMBERS: ┴*┘/64 -> ┴
  2253.          ╙╘┴ ┌1
  2254.          ├╠├
  2255.          ┼╧╥ #$╞╞
  2256.          ┴─├ #$01
  2257.          ╙╘┴ ┌2
  2258.          ╠─┴ (┌1),┘
  2259.          ╙┼├
  2260.          ╙┬├ (┌2),┘
  2261.          <<<              ;┴LL DONE :)
  2262.  
  2263.  
  2264. ┴──╙╒┬   ═┴├              ;┴DD OR SUBTRACT TWO NUMBERS
  2265.                           ;DEPENDING ON FIRST INPUT
  2266.          ╔╞ -=]1          ;╔F SUBTRACT
  2267.          ╙┼├              ;THEN USE THIS CODE
  2268.          ╙┬├ ]2
  2269.          ┼╠╙┼             ;OTHERWISE USE THIS CODE
  2270.          ├╠├
  2271.          ┴─├ ]2
  2272.          ╞╔╬
  2273.          <<<
  2274.  
  2275.  
  2276. ╨╥╧╩┼├╘  ═┴├              ;╘HE ACTUAL PROJECTION ROUTINE
  2277.                           ;TWO INPUTS ARE USED (X,Y)
  2278.                           ;CORRESPONDING TO (+/-1,+/-1)
  2279.                           ;╘HE THIRD INPUT IS USED TO
  2280.                           ;DETERMINE IF THE ROTATED
  2281.                           ;Z-COORDINATE SHOULD BE
  2282.                           ;STORED, AND IF SO WHERE.
  2283.                           ;╘HE CALLING ROUTINE HANDLES
  2284.                           ;CHANGING THE SIGN OF Z.
  2285.  
  2286.          ╠─┴ ╔33          ;├ALCULATE ROTATED Z:
  2287.          >>> ┴──╙╒┬,]1    ;╟31 ;┴DD OR SUBTRACT X
  2288.          >>> ┴──╙╒┬,]2    ;╚32 ;┴DD OR SUBTRACT Y
  2289.          ╔╞ ╨,]3          ;─O WE NEED TO STORE THE POINT?
  2290.          ╙╘┴ ]3           ;╘HEN DO SO!
  2291.          ╞╔╬
  2292. * ┼╧╥ #128 ;╫E ARE GOING TO TAKE 128+Z
  2293.          ╘┴╪              ;╬OW IT IS READY FOR INDEXING
  2294.          ╠─┴ ┌─╔╓,╪       ;╘ABLE OF D/(Z+Z0)
  2295.          ╘┴┘              ;┘ NOW CONTAINS PROJECTION
  2296.  
  2297.          ╠─┴ ├13          ;╬OW CALCULATE ROTATED X
  2298.          >>> ┴──╙╒┬,]1    ;┴11
  2299.          >>> ┴──╙╒┬,]2    ;┬12
  2300.          >>> ╙═╒╠╘        ;╙IGNED MULTIPLY ┴*┘/64->┴
  2301.          ├╠├
  2302.          ┴─├ #64          ;╧FFSET THE COORDINATE
  2303.          ╘┴╪              ;╬OW ╪ IS ROTATED X!
  2304.  
  2305.          ╠─┴ ╞23          ;╬OW IT'S Y'S TURN
  2306.          >>> ┴──╙╒┬,]1    ;─21
  2307.          >>> ┴──╙╒┬,]2    ;┼22
  2308.          >>> ╙═╒╠╘
  2309.          ├╠├
  2310.          ┴─├ #64          ;╧FFSET
  2311.          ├═╨ ┘═╔╬         ;╞IGURE OUT IF IT IS A
  2312.          ┬├╙ ╬╧╘═╔╬       ;MIN OR MAX VALUE FOR Y
  2313.          ╙╘┴ ┘═╔╬
  2314.          ┬├├ ╬╧╘═┴╪       ;╘HIS IS USED IN CALCULATING
  2315. ╬╧╘═╔╬   ├═╨ ┘═┴╪         ;THE FILLED FACES
  2316.          ┬├├ ╬╧╘═┴╪
  2317.          ╙╘┴ ┘═┴╪
  2318. ╬╧╘═┴╪   ╘┴┘              ;╬OT REALLY NECESSARY
  2319.  
  2320.          <<<              ;┴LL DONE
  2321.  
  2322.  
  2323.          ╠─┴ #64          ;╥ESET ┘MIN AND ┘MAX
  2324.          ╙╘┴ ┘═╔╬
  2325.          ╙╘┴ ┘═┴╪
  2326.  
  2327. * ╨1=[1 1 1]
  2328.          >>> ╨╥╧╩┼├╘,1;1;╨1┌ ;╥OTATED Z STORED IN ╨1┌
  2329.          ╙╘╪ ╨1╪
  2330.          ╙╘┘ ╨1┘
  2331. * ╨2=[1 -1 1]
  2332.          >>> ╨╥╧╩┼├╘,1    ;-1;╨2┌
  2333.          ╙╘╪ ╨2╪
  2334.          ╙╘┘ ╨2┘
  2335. * ╨3=[-1 -1 1]
  2336.          >>> ╨╥╧╩┼├╘,-1;-1;╬╧╨┼ ;─ON'T STORE Z-VALUE
  2337.          ╙╘╪ ╨3╪
  2338.          ╙╘┘ ╨3┘
  2339. * ╨4=[-1 1 1]
  2340.          >>> ╨╥╧╩┼├╘,-1;1;╨4┌
  2341.          ╙╘╪ ╨4╪
  2342.          ╙╘┘ ╨4┘
  2343. * ╨8=[-1 1 -1]
  2344.          >>> ╬┼╟,├13
  2345.          ╙╘┴ ├13
  2346.          >>> ╬┼╟,╞23
  2347.          ╙╘┴ ╞23
  2348.          >>> ╬┼╟,╔33
  2349.          ╙╘┴ ╔33
  2350.          >>> ╨╥╧╩┼├╘,-1;1;╬╧╨┼
  2351.          ╙╘╪ ╨8╪
  2352.          ╙╘┘ ╨8┘
  2353. * ╨7=[-1 -1 -1]
  2354.          >>> ╨╥╧╩┼├╘,-1;-1;╬╧╨┼
  2355.          ╙╘╪ ╨7╪
  2356.          ╙╘┘ ╨7┘
  2357. * ╨6=[1 -1 -1]
  2358.          >>> ╨╥╧╩┼├╘,1;-1;╬╧╨┼
  2359.          ╙╘╪ ╨6╪
  2360.          ╙╘┘ ╨6┘
  2361. * ╨5=[1 1 -1]
  2362.          >>> ╨╥╧╩┼├╘,1;1;╨5┌
  2363.          ╙╘╪ ╨5╪
  2364.          ╙╘┘ ╨5┘
  2365.  
  2366. * ┴ LITTLE MACRO
  2367.  
  2368. ╙┼╘┬╒╞   ═┴├              ;╨UT BUFFERS WHERE THEY CAN BE HURT
  2369.          ╠─┴ #00
  2370.          ╙╘┴ ┬╒╞╞┼╥
  2371.          ╠─┴ ┌╘┼═╨        ;ZTEMP CONTAINS THE HIGH BYTE HERE
  2372.          ╙╘┴ ┬╒╞╞┼╥+1
  2373.          <<<
  2374.  
  2375. **** ├LEAR BUFFER
  2376.  
  2377. * >>> ╙┼╘┬╒╞
  2378. *├╠╥┬╒╞ ╠─┴ #$00 ;╨RETTY STRAIGHTFORWARD,
  2379. * ╠─╪ #$08 ;╔ THINK
  2380. * ╠─┘ #$00
  2381. *:╠╧╧╨ ╙╘┴ (┬╒╞╞┼╥),┘
  2382. * ╔╬┘
  2383. * ┬╬┼ :╠╧╧╨
  2384. * ╔╬├ ┬╒╞╞┼╥+1
  2385. * ─┼╪
  2386. * ┬╬┼ :╠╧╧╨
  2387.  
  2388. * ╘HIS IS THE NEW AND IMPROVED BUFFER CLEAR
  2389. * ROUTINE FOR FILLED FACES
  2390.  
  2391.          >>> ╙┼╘┬╒╞
  2392.          ╙╘┴ ╘┼═╨1+1      ;BUFFER2 WILL POINT TO
  2393.          ╠─┴ #$80         ;BUFFER+128
  2394.          ╙╘┴ ╘┼═╨1        ;═AKES LIFE FASTER FOR US
  2395. ╞╔╠├╠╥   ╠─┴ #00
  2396.          ╠─╪ #$08         ;╫E'LL DO IT TWO AT A TIME
  2397.          ╠─┘ #$00
  2398. :╠╧╧╨1   ╙╘┴ (┬╒╞╞┼╥),┘
  2399.          ╙╘┴ (╘┼═╨1),┘
  2400.          ╔╬┘
  2401.          ├╨┘ ┘═╔╬
  2402.          ┬╬┼ :╠╧╧╨1
  2403.          ╠─┴ #$╞╞         ;╬OW LOAD WITH FILLS
  2404. :╠╧╧╨2   ╙╘┴ (┬╒╞╞┼╥),┘
  2405.          ╙╘┴ (╘┼═╨1),┘
  2406.          ╔╬┘
  2407.          ├╨┘ ┘═┴╪
  2408.          ┬├├ :╠╧╧╨2
  2409.          ╠─┴ #$00         ;┬LACK OUT THE REST
  2410. :╠╧╧╨3   ╙╘┴ (┬╒╞╞┼╥),┘
  2411.          ╙╘┴ (╘┼═╨1),┘
  2412.          ╔╬┘
  2413.          ┬╨╠ :╠╧╧╨3       ;╒NTIL ┘=128
  2414.          ╠─┘ #00
  2415.          ╔╬├ ┬╒╞╞┼╥+1
  2416.          ╔╬├ ╘┼═╨1+1
  2417.          ─┼╪
  2418.          ┬╬┼ :╠╧╧╨1       ;╟O ALL THE WAY AROUND
  2419.  
  2420. **** ╬OW DRAW THE LINES.
  2421. **** ┬UT FIRST CHECK FOR HIDDEN FACES!
  2422. **** ╥EMEMBER: ╨1=[1 1 1] ╨2=[1 -1 1] ╨3=[-1 -1 1]
  2423. **** ╨4=[-1 1 1] ╨5=[1 1 -1] ╨6=[1 -1 -1] ╨7=[-1 -1 -1]
  2424. **** ╨8=[-1 1 -1]
  2425.  
  2426. ╠╔╬┼╙    ╠─┴ #00
  2427.          ╙╘┴ ╞┴├┼╙        ;╚IDDEN FACE COUNTER
  2428. :╞┴├┼1   ╠─┴ ╦
  2429.          ╙┼├
  2430.          ╙┬├ ╨1┌
  2431.          ┬╓╙ :╞┴├┼6       ;╧VERFLOW ALREADY?
  2432.          ├╠├
  2433.          ┴─├ ╨5┌          ;╔S K-V1Z < 0?
  2434.                           ;╔F NOT, FACE IS INVISIBLE
  2435.          ┬╓├ :─╥┴╫1       ;┬UT WE MIGHT HAVE OVERFLOW
  2436.          ╠─┴ ╨5┌          ;╫AS OVERFLOW POS OR NEG?
  2437. :─╥┴╫1   ┬╨╠ :╞┴├┼6       ;╔F POS THEN K-V1Z > 0
  2438.  
  2439.          ╠─┴ #$01         ;╧THERWISE, DRAW THE
  2440.          ╙╘┴ ╞┴├┼╙        ;FACE!
  2441.  
  2442.          ╠─┴ ╨1╪
  2443.          ╙╘┴ ╘╪1
  2444.          ╠─┴ ╨1┘
  2445.          ╙╘┴ ╘┘1
  2446.          ╠─┴ ╨2╪
  2447.          ╙╘┴ ╘╪2
  2448.          ╠─┴ ╨2┘
  2449.          ╙╘┴ ╘┘2
  2450.          ╩╙╥ ─╥┴╫         ;╨1-╨2
  2451.  
  2452.          ╠─┴ ╨3╪
  2453.          ╙╘┴ ╘╪1
  2454.          ╠─┴ ╨3┘
  2455.          ╙╘┴ ╘┘1
  2456.          ╩╙╥ ─╥┴╫         ;╨2-╨3
  2457.  
  2458.          ╠─┴ ╨4╪
  2459.          ╙╘┴ ╘╪2
  2460.          ╠─┴ ╨4┘
  2461.          ╙╘┴ ╘┘2
  2462.          ╩╙╥ ─╥┴╫         ;╨3-╨4
  2463.  
  2464.          ╠─┴ ╨1╪
  2465.          ╙╘┴ ╘╪1
  2466.          ╠─┴ ╨1┘
  2467.          ╙╘┴ ╘┘1
  2468.          ╩╙╥ ─╥┴╫         ;╨4-╨1  ╞ACE 1 DONE.
  2469.          ╩═╨ :╞┴├┼2       ;╔F ONE IS VISIBLE, THE OTHER
  2470.                           ;ISN'T.
  2471. :╞┴├┼6   ╠─┴ ╦
  2472.          ╙┼├
  2473.          ╙┬├ ╨5┌
  2474.          ┬╓╙ :╞┴├┼2
  2475.          ├╠├
  2476.          ┴─├ ╨1┌          ;╬OW CHECK IF ╦-V6Z < 0
  2477.          ┬╓├ :─╥┴╫6       ;╠OVE THAT OVERFLOW
  2478.          ╠─┴ ╨1┌
  2479. :─╥┴╫6   ┬╨╠ :╞┴├┼2       ;╔F NOT, GO ON
  2480.  
  2481.          ╠─┴ #$20
  2482.          ╙╘┴ ╞┴├┼╙        ;╧THERWISE, DRAW IT
  2483.  
  2484.          ╠─┴ ╨5╪
  2485.          ╙╘┴ ╘╪2
  2486.          ╠─┴ ╨5┘
  2487.          ╙╘┴ ╘┘2
  2488.          ╠─┴ ╨6╪
  2489.          ╙╘┴ ╘╪1
  2490.          ╠─┴ ╨6┘
  2491.          ╙╘┴ ╘┘1
  2492.          ╩╙╥ ─╥┴╫         ;╨5-╨6
  2493.  
  2494.          ╠─┴ ╨7╪
  2495.          ╙╘┴ ╘╪2
  2496.          ╠─┴ ╨7┘
  2497.          ╙╘┴ ╘┘2
  2498.          ╩╙╥ ─╥┴╫         ;╨6-╨7
  2499.  
  2500.          ╠─┴ ╨8╪
  2501.          ╙╘┴ ╘╪1
  2502.          ╠─┴ ╨8┘
  2503.          ╙╘┴ ╘┘1
  2504.          ╩╙╥ ─╥┴╫         ;╨7-╨8
  2505.  
  2506.          ╠─┴ ╨5╪
  2507.          ╙╘┴ ╘╪2
  2508.          ╠─┴ ╨5┘
  2509.          ╙╘┴ ╘┘2
  2510.          ╩╙╥ ─╥┴╫         ;╨8-╨5
  2511.  
  2512. :╞┴├┼2   ╠─┴ ╦
  2513.          ╙┼├
  2514.          ╙┬├ ╨1┌
  2515.          ┬╓╙ :╞┴├┼5
  2516.          ├╠├
  2517.          ┴─├ ╨4┌          ;╦-V2Z < 0?
  2518.          ┬╓├ :─╥┴╫2
  2519.          ╠─┴ ╨4┌
  2520. :─╥┴╫2   ┬╨╠ :╞┴├┼5
  2521.          ╠─┴ #$02         ;╔F SO, DRAW IT!
  2522.          ╧╥┴ ╞┴├┼╙
  2523.          ╙╘┴ ╞┴├┼╙
  2524.  
  2525.          ╠─╪ ╨1╪          ;╫E'RE DOING THIS THIS WAY
  2526.          ╙╘╪ ╘╪1          ;TO SAVE A FEW CYCLES
  2527.          ╠─╪ ╨1┘
  2528.          ╙╘╪ ╘┘1
  2529.  
  2530.          ┴╬─ #$01         ;╙HARES AN EDGE WITH FACE 1
  2531.          ┬╬┼ :╞2╙2        ;╙KIP TO NEXT EDGE IF PRESENT
  2532.  
  2533.          ╠─┴ ╨2╪
  2534.          ╙╘┴ ╘╪2
  2535.          ╠─┴ ╨2┘
  2536.          ╙╘┴ ╘┘2
  2537.          ╩╙╥ ─╥┴╫         ;╨1-╨2
  2538.  
  2539. :╞2╙2    ╠─╪ ╨5╪
  2540.          ╙╘╪ ╘╪2
  2541.          ╠─╪ ╨5┘
  2542.          ╙╘╪ ╘┘2
  2543.          ╩╙╥ ─╥┴╫         ;╨1-╨5
  2544.  
  2545.          ╠─╪ ╨6╪
  2546.          ╙╘╪ ╘╪1
  2547.          ╠─╪ ╨6┘
  2548.          ╙╘╪ ╘┘1
  2549.  
  2550.          ╠─┴ ╞┴├┼╙
  2551.          ┴╬─ #$20         ;┴LSO SHARES AN EDGE WITH 6
  2552.          ┬╬┼ :╞2╙4
  2553.  
  2554.          ╩╙╥ ─╥┴╫         ;╨5-╨6
  2555.  
  2556. :╞2╙4    ╠─┴ ╨2╪
  2557.          ╙╘┴ ╘╪2
  2558.          ╠─┴ ╨2┘
  2559.          ╙╘┴ ╘┘2          ;╙UCH IS FACE 2
  2560.          ╩╙╥ ─╥┴╫         ;╨6-╨2
  2561.          ╩═╨ :╞┴├┼3       ;╙KIP 5
  2562.  
  2563. :╞┴├┼5   ╠─┴ ╦
  2564.          ╙┼├
  2565.          ╙┬├ ╨4┌
  2566.          ┬╓╙ :╞┴├┼3
  2567.          ├╠├
  2568.          ┴─├ ╨1┌          ;╙AME THING AGAIN...
  2569.          ┬╓├ :─╥┴╫5
  2570.          ╠─┴ ╨1┌
  2571. :─╥┴╫5   ┬╨╠ :╞┴├┼3
  2572.          ╠─┴ #$10
  2573.          ╧╥┴ ╞┴├┼╙
  2574.          ╙╘┴ ╞┴├┼╙
  2575.  
  2576.          ╠─╪ ╨3╪
  2577.          ╙╘╪ ╘╪1
  2578.          ╠─╪ ╨3┘
  2579.          ╙╘╪ ╘┘1
  2580.  
  2581.          ┴╬─ #$01         ;╙HARES WITH 1
  2582.          ┬╬┼ :╞5╙2
  2583.  
  2584.          ╠─┴ ╨4╪
  2585.          ╙╘┴ ╘╪2
  2586.          ╠─┴ ╨4┘
  2587.          ╙╘┴ ╘┘2
  2588.          ╩╙╥ ─╥┴╫         ;╨3-╨4
  2589.  
  2590. :╞5╙2    ╠─┴ ╨7╪
  2591.          ╙╘┴ ╘╪2
  2592.          ╠─┴ ╨7┘
  2593.          ╙╘┴ ╘┘2
  2594.          ╩╙╥ ─╥┴╫         ;╨3-╨7
  2595.  
  2596.          ╠─┴ ╨8╪
  2597.          ╙╘┴ ╘╪1
  2598.          ╠─┴ ╨8┘
  2599.          ╙╘┴ ╘┘1
  2600.  
  2601.          ╠─┴ ╞┴├┼╙
  2602.          ┴╬─ #$20         ;╙HARES WITH 6
  2603.          ┬╬┼ :╞5╙4
  2604.  
  2605.          ╩╙╥ ─╥┴╫         ;╨7-╨8
  2606. :╞5╙4    ╠─┴ ╨4╪
  2607.          ╙╘┴ ╘╪2
  2608.          ╠─┴ ╨4┘
  2609.          ╙╘┴ ╘┘2          ;╨8-╨4
  2610.          ╩╙╥ ─╥┴╫         ;╘WO MORE TO GO!
  2611.  
  2612. :╞┴├┼3   ╠─┴ ╦
  2613.          ╙┼├
  2614.          ╙┬├ ╨1┌
  2615.          ┬╓╙ :╞┴├┼4
  2616.          ├╠├
  2617.          ┴─├ ╨2┌
  2618.          ┬╓├ :─╥┴╫3
  2619.          ╠─┴ ╨2┌
  2620. :─╥┴╫3   ┬╨╠ :╞┴├┼4       ;┴H RECKON IT'S A'HIDDEN, YUP
  2621.          ╠─┴ #$04
  2622.          ╧╥┴ ╞┴├┼╙
  2623.          ╙╘┴ ╞┴├┼╙
  2624.  
  2625.          ╠─╪ ╨1╪
  2626.          ╙╘╪ ╘╪1
  2627.          ╠─╪ ╨1┘
  2628.          ╙╘╪ ╘┘1
  2629.  
  2630.          ┴╬─ #$01         ;╙HARES WITH 1
  2631.          ┬╬┼ :╞3╙2
  2632.  
  2633.          ╠─┴ ╨4╪
  2634.          ╙╘┴ ╘╪2
  2635.          ╠─┴ ╨4┘
  2636.          ╙╘┴ ╘┘2
  2637.          ╩╙╥ ─╥┴╫         ;╨1-╨4
  2638.  
  2639. :╞3╙2    ╠─╪ ╨5╪
  2640.          ╙╘╪ ╘╪2
  2641.          ╠─╪ ╨5┘
  2642.          ╙╘╪ ╘┘2
  2643.  
  2644.          ╠─┴ ╞┴├┼╙
  2645.          ┴╬─ #$02         ;╙HARES WITH 2
  2646.          ┬╬┼ :╞3╙3
  2647.  
  2648.          ╩╙╥ ─╥┴╫         ;╨1-╨5
  2649. :╞3╙3    ╠─╪ ╨8╪
  2650.          ╙╘╪ ╘╪1
  2651.          ╠─╪ ╨8┘
  2652.          ╙╘╪ ╘┘1
  2653.  
  2654.          ╠─┴ ╞┴├┼╙
  2655.          ┴╬─ #$20         ;╙HARES WITH 6
  2656.          ┬╬┼ :╞3╙4
  2657.  
  2658.          ╩╙╥ ─╥┴╫         ;╨5-╨8
  2659. :╞3╙4    ╠─╪ ╨4╪
  2660.          ╙╘╪ ╘╪2
  2661.          ╠─╪ ╨4┘
  2662.          ╙╘╪ ╘┘2
  2663.  
  2664.          ╠─┴ ╞┴├┼╙
  2665.          ┴╬─ #$10         ;╙HARES WITH 5
  2666.          ┬╬┼ ╞┴├┼─╧╬┼
  2667.  
  2668.          ╩╙╥ ─╥┴╫         ;╨8-╨4
  2669.          ╩═╨ ╞┴├┼─╧╬┼
  2670.  
  2671. :╞┴├┼4   ╠─┴ ╦
  2672.          ╙┼├
  2673.          ╙┬├ ╨2┌
  2674.          ┬╓╙ ╞┴├┼─╧╬┼
  2675.          ├╠├
  2676.          ┴─├ ╨1┌
  2677.          ┬╓├ :─╥┴╫4
  2678.          ╠─┴ ╨1┌
  2679. :─╥┴╫4   ┬╨╠ ╞┴├┼─╧╬┼
  2680.  
  2681.          ╠─┴ ╨2╪
  2682.          ╙╘┴ ╘╪1
  2683.          ╠─┴ ╨2┘
  2684.          ╙╘┴ ╘┘1
  2685.  
  2686.          ╠─┴ ╞┴├┼╙
  2687.          ┴╬─ #$01         ;╙HARES WITH 1
  2688.          ┬╬┼ :╞4╙2
  2689.  
  2690.          ╠─┴ ╨3╪
  2691.          ╙╘┴ ╘╪2
  2692.          ╠─┴ ╨3┘
  2693.          ╙╘┴ ╘┘2
  2694.          ╩╙╥ ─╥┴╫         ;╨2-╨3
  2695.  
  2696. :╞4╙2    ╠─┴ ╨6╪
  2697.          ╙╘┴ ╘╪2
  2698.          ╠─┴ ╨6┘
  2699.          ╙╘┴ ╘┘2
  2700.  
  2701.          ╠─┴ ╞┴├┼╙
  2702.          ┴╬─ #$02         ;╙HARES WITH 2
  2703.          ┬╬┼ :╞4╙3
  2704.  
  2705.          ╩╙╥ ─╥┴╫         ;╨2-╨6
  2706. :╞4╙3    ╠─┴ ╨7╪
  2707.          ╙╘┴ ╘╪1
  2708.          ╠─┴ ╨7┘
  2709.          ╙╘┴ ╘┘1
  2710.  
  2711.          ╠─┴ ╞┴├┼╙
  2712.          ┴╬─ #$20         ;╙HARES WITH 6
  2713.          ┬╬┼ :╞4╙4
  2714.  
  2715.          ╩╙╥ ─╥┴╫         ;╨6-╨7
  2716. :╞4╙4    ╠─┴ ╨3╪
  2717.          ╙╘┴ ╘╪2
  2718.          ╠─┴ ╨3┘
  2719.          ╙╘┴ ╘┘2
  2720.  
  2721.          ╠─┴ ╞┴├┼╙
  2722.          ┴╬─ #$10         ;╙HARES WITH 5
  2723.          ┬╬┼ ╞┴├┼─╧╬┼
  2724.  
  2725.          ╩╙╥ ─╥┴╫         ;╨7-╨3
  2726. ╞┴├┼─╧╬┼                  ;╫HEW!  ╘IME FOR A BEER.
  2727.  
  2728. **** ╬OW WE NEED TO UNFILL THE OUTSIDE FROM THE FACES
  2729. ╒╬╞╔╠╠   ╠─┘ ┘═╔╬
  2730. :╠╧╧╨    >>> ╙┼╘┬╒╞
  2731.          ╠─╪ #08
  2732. :╠1      ╠─┴ (┬╒╞╞┼╥),┘
  2733.          ┼╧╥ #$╞╞         ;╟O TILL WE FIND A PLOTTED
  2734.          ┬╬┼ :╟╧╘├╚┴      ;POINT (I.E. ┴ <> $╞╞)
  2735. * ╠─┴ #00 ;╒NFILLING AS WE GO...
  2736.          ╙╘┴ (┬╒╞╞┼╥),┘
  2737.          ╠─┴ #$80
  2738.          ╙╘┴ ┬╒╞╞┼╥
  2739.          ╠─┴ (┬╒╞╞┼╥),┘
  2740.          ┼╧╥ #$╞╞
  2741.          ┬╬┼ :╟╧╘├╚┴
  2742. * ╠─┴ #00
  2743.          ╙╘┴ (┬╒╞╞┼╥),┘
  2744.          ╙╘┴ ┬╒╞╞┼╥
  2745.          ╔╬├ ┬╒╞╞┼╥+1
  2746.          ─┼╪              ;╘HIS IS OUR SAFETY VALVE
  2747.          ┬╬┼ :╠1          ;╥EALLY SHOULDN'T NEED IT
  2748.          ╩╙╥ ├╚╧╦┼
  2749.          ╩═╨ ╙╫┴╨┬╒╞
  2750.  
  2751. :╟╧╘├╚┴                   ;┴ CONTAINS THE ┼╧╥ PLOT VALUE
  2752.          ╙╘┴ ╘┼═╨1        ;╬OW FIND THE HIGH BIT
  2753.          ╠─┴ #00
  2754. :╠2      ╙┼├
  2755.          ╥╧╠
  2756.          ╠╙╥ ╘┼═╨1        ;╙HOULD REALLY USE A TABLE
  2757.          ┬╬┼ :╠2          ;FOR THIS!
  2758.          ┴╬─ (┬╒╞╞┼╥),┘
  2759.          ╙╘┴ (┬╒╞╞┼╥),┘
  2760.  
  2761.          ╠─┴ ┌╘┼═╨        ;╬OW GO TO THE END
  2762.                           ;├ARRY IS CLEAR
  2763.                           ;┴CTUALLY WE ADD 7
  2764.          ┴─├ #$06         ;16 COLUMNS OF 128 BYTES
  2765.          ╙╘┴ ┬╒╞╞┼╥+1
  2766.          ╠─┴ #$80
  2767.          ╙╘┴ ┬╒╞╞┼╥
  2768. :╠╧╧╨2   ╠─┴ (┬╒╞╞┼╥),┘   ;┴ND WORK BACKWARDS!
  2769.          ┼╧╥ #$╞╞
  2770.          ┬╬┼ :╟╧╘├╚┴2
  2771.          ╙╘┴ (┬╒╞╞┼╥),┘
  2772.          ╙╘┴ ┬╒╞╞┼╥       ;╙TICK A ZERO INTO BUFFER
  2773.          ╠─┴ (┬╒╞╞┼╥),┘
  2774.          ┼╧╥ #$╞╞
  2775.          ┬╬┼ :╟╧╘├╚┴2
  2776.          ╙╘┴ (┬╒╞╞┼╥),┘
  2777.          ╠─┴ #$80
  2778.          ╙╘┴ ┬╒╞╞┼╥
  2779.          ─┼├ ┬╒╞╞┼╥+1
  2780.          ┬╬┼ :╠╧╧╨2
  2781.  
  2782. :╟╧╘├╚┴2 ╙╘┴ ╘┼═╨1        ;┴GAIN FIND THE HIGH BIT
  2783.          ╠─┴ #00
  2784. :╠3      ╙┼├
  2785.          ╥╧╥
  2786.          ┴╙╠ ╘┼═╨1
  2787.          ┬╬┼ :╠3
  2788.          ┴╬─ (┬╒╞╞┼╥),┘
  2789.          ╙╘┴ (┬╒╞╞┼╥),┘
  2790.  
  2791.          ╔╬┘              ;╬OW KEEP GOING
  2792.          ├╨┘ ┘═┴╪
  2793.          ┬├├ :╠╧╧╨        ;╒NTIL WE HIT YMAX!
  2794.          ┬┼╤ :╠╧╧╨        ;╫E NEED THE LAST ONE TOO.
  2795.  
  2796. **** ╙WAP BUFFERS
  2797.  
  2798. ╙╫┴╨┬╒╞  ╠─┴ ╓═├╙┬
  2799.          ┼╧╥ #$02         ;╨RETTY TRICKY, EH?
  2800.          ╙╘┴ ╓═├╙┬
  2801.          ╠─┴ #$08
  2802.          ┼╧╥ ┌╘┼═╨        ;ZTEMP=HIGH BYTE JUST FLIPS
  2803.          ╙╘┴ ┌╘┼═╨        ;BETWEEN $30 AND $38
  2804.  
  2805.          ╩═╨ ═┴╔╬         ;┴ROUND AND AROUND WE GO...
  2806.  
  2807.          ╘╪╘ '╙AME THING WE DO EVERY NIGHT, ╨INKY: '
  2808.          ╘╪╘ 'TRY TO TAKE OVER THE WORLD!'
  2809.  
  2810.  
  2811. *-------------------------------
  2812. * ╟ENERAL QUESTIONABLE-VALUE ERROR PROCEDURE
  2813.  
  2814. ├╚╧╦┼    ╠─╪ #00
  2815. :╠╧╧╨    ╠─┴ :├╘┼╪╘,╪
  2816.          ┬┼╤ :─╧╬┼
  2817.          ╩╙╥ ├╚╥╧╒╘
  2818.          ╔╬╪
  2819.          ╩═╨ :╠╧╧╨
  2820. :─╧╬┼    ╥╘╙
  2821. :├╘┼╪╘   ╚┼╪ 0─           ;├╥
  2822.          ╘╪╘ 'SOMETHING CHOKED :('
  2823.          ╚┼╪ 0─00
  2824.  
  2825.          ╘╪╘ '╬ARF!'
  2826.  
  2827. *-------------------------------
  2828. * ─RAWIN' A LINE.  ┴ FAHN LAHN.
  2829.  
  2830. *** ╙OME USEFUL MACROS
  2831.  
  2832. ╨╠╧╘╨╪   ═┴├              ;PLOT A POINT IN X
  2833.          ╨╚┴              ;╒SE THIS ONE EVERY TIME
  2834.          ╠─┴ ┬╔╘╨,╪       ;╪ IS INCREASED
  2835.          ┬═╔ ├1
  2836.          ╠─┴ #$80         ;╘ABLE HAS BEEN REARRANGED
  2837.          ┼╧╥ ┬╒╞╞┼╥       ;FOR FILLING FACES
  2838.          ╙╘┴ ┬╒╞╞┼╥
  2839.          ┬═╔ ├2
  2840.          ╔╬├ ┬╒╞╞┼╥+1
  2841. ├2       ╠─┴ #%01111111   ;╬OTE THAT THIS IS CHANGED
  2842. ├1       ┴╬─ (┬╒╞╞┼╥),┘   ;FOR PLOTTING FILLED FACES
  2843.          ╙╘┴ (┬╒╞╞┼╥),┘
  2844.          ╨╠┴              ;╬EED TO SAVE ┴!
  2845.          <<<
  2846.  
  2847. ╨╠╧╘╨┘   ═┴├              ;╨LOT A POINT IN Y: SIMPLER AND NECESSARY!
  2848.          ╨╚┴              ;╒SE THIS ONE WHEN YOU JUST INCREASE ┘
  2849.          ╠─┴ ┬╔╘╨,╪       ;BUT ╪ DOESN'T CHANGE
  2850.          ┴╬─ (┬╒╞╞┼╥),┘
  2851.          ╙╘┴ (┬╒╞╞┼╥),┘
  2852.          ╨╠┴
  2853.          <<<
  2854.  
  2855. ├╔╬╔╘    ═┴├              ;═ACRO TO INITIALIZE THE COUNTER
  2856.          ╠─┴ ]1           ;DX OR DY
  2857.          ╠╙╥
  2858.          ┼╧╥ #$╞╞         ;(╬OT REALLY TWO'S COMPLEMENT)
  2859.          ┴─├ #$01         ;┴ = 256-DX/2 OR 256-DY/2
  2860.          <<<              ;╘HE DX/2 MAKES A NICER LOOKING LINE
  2861.  
  2862. ╪╙╘┼╨    ═┴├              ;═ACRO TO TAKE A STEP IN ╪
  2863. ╪╠╧╧╨    ╔╬╪
  2864.          ┴─├ ─┘
  2865.          ┬├├ ╠1
  2866. * ─O WE USE ╔╬┘ OR ─┼┘ HERE?
  2867.          ╔╞ ╔,]1          ;╔F THE FIRST CHARACTER IS AN '╔'
  2868.          ╔╬┘
  2869.          ┼╠╙┼
  2870.          ─┼┘
  2871.          ╞╔╬
  2872.          ╙┬├ ─╪
  2873. ╠1       >>> ╨╠╧╘╨╪       ;┴LWAYS TAKE A STEP IN ╪
  2874.          ├╨╪ ╪2
  2875.          ┬╬┼ ╪╠╧╧╨
  2876.          <<<
  2877.  
  2878. ┘╙╘┼╨    ═┴├              ;╙AME THING, BUT FOR ┘
  2879. ┘╠╧╧╨    ╔╞ ╔,]1
  2880.          ╔╬┘
  2881.          ┼╠╙┼
  2882.          ─┼┘
  2883.          ├╠├              ;╓ERY IMPORTANT!
  2884.          ╞╔╬
  2885.          ┴─├ ─╪
  2886.          ┬├├ ╠2
  2887.          ╔╬╪              ;┴LWAYS INCREASE ╪
  2888.          ╙┬├ ─┘
  2889.          >>> ╨╠╧╘╨╪
  2890.          ╩═╨ ╠3
  2891. ╠2       >>> ╨╠╧╘╨┘       ;╫E ONLY INCREASED ┘
  2892. ╠3       ├╨┘ ┘2
  2893.          ┬╬┼ ┘╠╧╧╨
  2894.          <<<
  2895.  
  2896. **** ╔NITIAL LINE SETUP
  2897.  
  2898. ─╥┴╫     >>> ═╧╓┼,╘╪1     ;╪1  ;═OVE STUFF INTO ZERO PAGE
  2899.          >>> ═╧╓┼,╘╪2     ;╪2  ;╫HERE IT CAN BE MODIFIED
  2900.          >>> ═╧╓┼,╘┘1     ;┘1
  2901.          >>> ═╧╓┼,╘┘2     ;┘2
  2902.          >>> ╙┼╘┬╒╞       ;╬OW WE CAN CLOBBER THE BUFFER
  2903.  
  2904.          ╙┼├              ;═AKE SURE X1<X2
  2905.          ╠─┴ ╪2
  2906.          ╙┬├ ╪1
  2907.          ┬├╙ :├╧╬╘
  2908.          ╠─┴ ┘2           ;╔F NOT, SWAP ╨1 AND ╨2
  2909.          ╠─┘ ┘1
  2910.          ╙╘┴ ┘1
  2911.          ╙╘┘ ┘2
  2912.          ╠─┴ ╪1
  2913.          ╠─┘ ╪2
  2914.          ╙╘┘ ╪1
  2915.          ╙╘┴ ╪2
  2916.  
  2917.          ╙┼├
  2918.          ╙┬├ ╪1           ;╬OW ┴=DX
  2919. :├╧╬╘    ╙╘┴ ─╪
  2920.          ╠─╪ ╪1           ;╨UT X1 INTO ╪, NOW WE CAN TRASH ╪1
  2921.  
  2922. ├╧╠╒═╬   ╠─┴ ╪1           ;╞IND THE FIRST COLUMN FOR ╪
  2923.          ╠╙╥              ;(╘HIS CAN BE MADE MUCH FASTER!)
  2924.          ╠╙╥              ;╘HERE ARE X1/8 128 BYTE BLOCKS
  2925.          ╠╙╥              ;╫HICH MEANS X1/16 256 BYTE BLOCKS
  2926.          ╠╙╥
  2927.          ┬├├ :┼╓┼╬        ;╫ITH A POSSIBLE EXTRA 128 BYTE BLOCK
  2928.          ╠─┘ #$80         ;IF SO, SET THE HIGH BIT
  2929.          ╙╘┘ ┬╒╞╞┼╥
  2930.          ├╠├
  2931. :┼╓┼╬    ┴─├ ┬╒╞╞┼╥+1     ;┴DD IN THE NUMBER OF 256 BYTE BLOCKS
  2932.          ╙╘┴ ┬╒╞╞┼╥+1     ;┴ND STORE IT!
  2933.  
  2934.          ╙┼├
  2935.          ╠─┴ ┘2           ;├ALCULATE DY
  2936.          ╙┬├ ┘1
  2937.          ┬├╙ :├╧╬╘2       ;╔S Y2>Y1?
  2938.          ┼╧╥ #$╞╞         ;╧THERWISE DY=Y1-Y2
  2939.          ┴─├ #$01
  2940. :├╧╬╘2   ╙╘┴ ─┘
  2941.          ├═╨ ─╪           ;╫HO'S BIGGER: DY OR DX?
  2942.          ┬├╙ ╙╘┼╨╔╬┘      ;╔F DY, WE NEED TO TAKE BIG STEPS IN Y
  2943.  
  2944. ╙╘┼╨╔╬╪  ╠─┘ ┘1           ;╪ IS ALREADY SET TO X1
  2945.          ╠─┴ ┬╔╘╨,╪       ;╨LOT THE FIRST POINT
  2946.          ┴╬─ (┬╒╞╞┼╥),┘
  2947.          ╙╘┴ (┬╒╞╞┼╥),┘
  2948.          >>> ├╔╬╔╘,─╪     ;╔NITIALIZE THE COUNTER
  2949.          ├╨┘ ┘2
  2950.          ┬├╙ ╪─┼├┘        ;─O WE STEP FORWARDS OR BACKWARDS IN ┘?
  2951.  
  2952. ╪╔╬├┘    >>> ╪╙╘┼╨,╔╬┘
  2953.          ╥╘╙
  2954.  
  2955. ╙╘┼╨╔╬┘  ╠─┘ ┘1           ;╫ELL, A LITTLE REPETITION NEVER HURT ANYONE
  2956.          ╠─┴ ┬╔╘╨,╪
  2957.          ┴╬─ (┬╒╞╞┼╥),┘
  2958.          ╙╘┴ (┬╒╞╞┼╥),┘
  2959.          >>> ├╔╬╔╘,─┘
  2960.          ├╨┘ ┘2
  2961.          ┬├╙ ┘─┼├┘
  2962.  
  2963. ┘╔╬├┘    >>> ┘╙╘┼╨,╔╬┘
  2964.          ╥╘╙
  2965.  
  2966. ╪─┼├┘    >>> ╪╙╘┼╨,─┼┘    ;╘HIS IS PUT HERE SO THAT
  2967.          ╥╘╙              ;┬RANCHES ARE LEGAL
  2968.  
  2969. ┘─┼├┘    >>> ┘╙╘┼╨,─┼┘
  2970.          ╥╘╙
  2971.  
  2972.  
  2973. *-------------------------------
  2974. * ├LEAN UP
  2975.  
  2976. ├╠┼┴╬╒╨  ╠─┴ ╓═├╙┬        ;╙WITCH CHAR ROM BACK IN
  2977.          ┴╬─ #%11110101   ;DEFAULT
  2978.          ╙╘┴ ╓═├╙┬
  2979.  
  2980.          ╥╘╙              ;BYE!
  2981.  
  2982.          ╘╪╘ '╚APPY ╚OLIDAYS! '
  2983.          ╘╪╘ 'SLJ 12/94'
  2984.  
  2985. *-------------------------------
  2986. * ╙ET UP BIT TABLE
  2987.  
  2988.          ─╙ ^             ;├LEAR TO END OF PAGE
  2989.                           ;╙O THAT TABLES START ON A PAGE BOUNDARY
  2990. ┬╔╘╨     ╠╒╨ 16           ;128 ┼NTRIES FOR ╪
  2991.          ─╞┬ %01111111
  2992.          ─╞┬ %10111111
  2993.          ─╞┬ %11011111
  2994.          ─╞┬ %11101111
  2995.          ─╞┬ %11110111
  2996.          ─╞┬ %11111011
  2997.          ─╞┬ %11111101
  2998.          ─╞┬ %11111110
  2999.          --^
  3000.  
  3001. ╙╔╬                       ;╘ABLE OF SINES, 120 BYTES
  3002. ├╧╙      ┼╤╒ ╙╔╬+128      ;╘ABLE OF COSINES
  3003.                           ;┬OTH OF THESE TRIG TABLES ARE
  3004.                           ;CURRENTLY SET UP FROM ┬┴╙╔├
  3005. ┌─╔╓     ┼╤╒ ├╧╙+128      ;─IVISION TABLE
  3006. ╘═┴╘╚    ┼╤╒ ┌─╔╓+384     ;═ATH TABLE OF F(X)=X*X/256
  3007.  
  3008.